在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;

只设置一个视图的约束,还是两者都设置,结果都相同。

最佳答案

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

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

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

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

09-04 19:10