如何在运行时折叠 Xamarin.iOS 中的视图?

How to collapse a view in Xamarin.iOS in runtime?

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

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

一次有效。 但是当我尝试通过调用

再次扩展视图时
FilterLayout.HeightAnchor.ConstraintEqualTo(0f).Active = false;

或者只是设置一个新值:

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

或者写两行, 大小不变。

(FilterLayout 的大小最初由其子视图定义,其中第一个子视图的顶部与其 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,您需要在设置约束后通过调用 layoutIfNeeded 来强制更新布局:

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

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

我从 Xamarin 论坛得到了答案,事实是,通过设置 ...Anchor 属性,您是在添加约束,而不是修改它,即使您在同一行中使用 .主动 = 假。 这就解释了为什么第一次更改布局,但之后没有更改。

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

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

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