如何在运行时折叠 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 中的轮播视图(图像)
MvvmCross 4 和 Xamarin.iOS -> 使用 Storyboard 时如何从 Core 加载视图控制器?