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

Posted

技术标签:

【中文标题】如何在运行时折叠 Xamarin.iOS 中的视图?【英文标题】:How to collapse a view in Xamarin.iOS in runtime? 【发布时间】: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;

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

【问题讨论】:

【参考方案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 应该会自动调整其内容大小。

【讨论】:

以上是关于如何在运行时折叠 Xamarin.iOS 中的视图?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin IOS - Xamarin IOS 中的轮播视图(图像)

在 xamarin.ios 中的视图控制器之间传递数据

如何在 xamarin ios 中使用轮播视图

MvvmCross 4 和 Xamarin.iOS -> 使用 Storyboard 时如何从 Core 加载视图控制器?

关闭键盘后 Xamarin.iOS 中的奇怪崩溃

Xamarin.iOS:如何将 NavigationBar 添加到视图