iOS UIStackView禁止隐藏

时间:2016-04-29 22:25:15

标签: ios xamarin uiscrollview

我的UIStackView (stack1)包含两个排列的视图:UIStackView (stack2)UIScrollView (scroll)

stack2具有固定的高度,它和scroll都有固定的宽度。 scroll将占用余下的空间。

只需按一下按钮,stack2将被隐藏,导致scroll展开并“向上移动”并使用相同的按钮,stack2将重新出现并且`滚动将返回到原始大小

出于某种原因,第一个动画工作正常,但当stack2应该重新出现时,它会出现在scroll后面,它仍占据整个空间。这是为什么?我也得到一些“无法同时满足约束”的警告。

以下是它们的创建方式(这是xamarin btw,但我认为不重要)

var stack1 = new UIStackView(View.Frame);
stack1.Axis = UILayoutConstraintAxis.Vertical;
stack1.Alignment = UIStackViewAlignment.Center;
stack1.Distribution = UIStackViewDistribution.FillProportionally;
stack1.Spacing = 0;

var scroll = new UIScrollView(frame);
var stack2 = new UIStackView();
stack2.Axis = UILayoutConstraintAxis.Horizontal;
stack2.Alignment = UIStackViewAlignment.Center;
stack2.Distribution = UIStackViewDistribution.EqualCentering;
stack2.Spacing = 20;

... adding things in stack2 ...

scroll.TranslatesAutoresizingMaskIntoConstraints = false;
stack2.TranslatesAutoresizingMaskIntoConstraints = false;

NSLayoutConstraint.ActivateConstraints(new []{
    stack2.HeightAnchor.ConstraintEqualTo(200),
    scroll.HeightAnchor.ConstraintEqualTo(frame.Height),
    scroll.WidthAnchor.ConstraintEqualTo(frame.Width)
});

stack1.AddArrangedSubview(stack2);
stack1.AddArrangedSubview(scroll);
View.AddSubview(stack1);

1 个答案:

答案 0 :(得分:1)

一方面,您设置scroll的固定宽度和高度(等于view.frame)。另一方面,scroll的大小由stack1确定(基于它的排列,间距,分布属性以及已排列的子视图中scroll的位置阵列)

因此约束相互矛盾。当您隐藏stack2时 - 矛盾会暂时消失,但当stack2返回到视图时它会再次出现。 在这种情况下,系统必须忽略一些矛盾的约束(从具有较低优先级btw的约束开始),因此它决定删除stack1排列以满足scroll的高度和宽度约束。

尝试删除此代码字符串:scroll.HeightAnchor.ConstraintEqualTo(frame.Height), 它应该可以正常工作。