【问题标题】:How to collapse a view in Xamarin.iOS in runtime?如何在运行时折叠 Xamarin.iOS 中的视图?
【发布时间】:2020-04-25 12:04:15
【问题描述】:

在 Android 中,我们可以在视图的 Visibility 上使用 ViewStates.Gone,但在 iOS 中,如果将 Hidden 属性设置为 false,视图仍会占用空间。 我正在使用自动布局,所以我想改变尺寸约束,例如:

FilterLayout.HeightAnchor.ConstraintEqualTo(0f).Active = true;

它工作一次。 但是当我尝试通过调用再次扩展视图时

FilterLayout.HeightAnchor.ConstraintEqualTo(0f).Active = false;

或者只是设置一个新值:

FilterLayout.HeightAnchor.ConstraintEqualTo(200f).Active = true;

或者写两行, 大小不变。

(FilterLayout的大小最初是由它的子视图定义的,第一个子视图的top匹配它的topMargin,最后一个子视图的底部匹配它的bottomMargin。)

我什至尝试更改相邻容器的约束,使其不附加到 FilterLayout,结果是,FilterLayout 被压缩,并且将约束更改回没有任何作用。

页面顶部是 SearchLayout,FilterLayout 下方,UserSearchList 下方。

隐藏 FilterLayout 的工作原理:

FilterLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = false;
UserSearchList.TopAnchor.ConstraintEqualTo(FilterLayout.BottomAnchor).Active = false;

SearchLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = true;
UserSearchList.TopAnchor.ConstraintEqualTo(SearchLayout.BottomAnchor).Active = true;

尝试再次显示它:

SearchLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = false;
UserSearchList.TopAnchor.ConstraintEqualTo(SearchLayout.BottomAnchor).Active = false;

FilterLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = true;
UserSearchList.TopAnchor.ConstraintEqualTo(FilterLayout.BottomAnchor).Active = true;

只设置一个视图的约束,或者两者都设置都没有关系,结果是一样的。

【问题讨论】:

    标签: ios xamarin.ios autolayout collapse


    【解决方案1】:

    我从 Xamarin 论坛得到了答案,事实是,通过设置 ...Anchor 属性,您正在添加一个约束,而不是修改它,即使您使用 .Active = false 编写同一行也是如此。 这就解释了为什么布局是第一次改变,但之后没有改变。

    您需要循环通过约束来删除一个:

    foreach (NSLayoutConstraint constraint in FilterLayout.Constraints)
    {
        if (constraint.FirstAttribute == NSLayoutAttribute.Height)
        {
            FilterLayout.RemoveConstraint(constraint);
        }
    }
    

    调用 layoutIfNeeded 不会影响此行为,但使用 StackView 可能是一种替代解决方案。

    【讨论】:

    • 您可以标记它,这将帮助更多有相同问题的人:)。
    【解决方案2】:

    对于 iOS,您需要在设置约束后调用 layoutIfNeeded 来强制更新布局:

    https://docs.microsoft.com/en-us/dotnet/api/uikit.uiview.layoutifneeded?view=xamarin-ios-sdk-12

    另一个建议是将您的视图放在 StackViews 中。然后,当您在 StackView 内的视图上设置 hidden 属性时,StackView 应该会自动调整其内容大小。

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2018-01-04
      • 2010-11-25
      相关资源
      最近更新 更多