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

问题描述 投票:2回答:2

在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的大小最初由其子视图定义,其中第一个子视图的顶部与它的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
2个回答
1
投票

我从Xamarin论坛得到了答案,事实是,通过设置... Anchor属性,您正在添加约束,而不是对其进行修改,即使您使用.Active = false编写同一行。这说明了为什么布局是第一次更改的,但之后没有更改。

您需要遍历所有约束以删除一个约束:

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.