在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可以作为替代解决方案。