以编程方式更改UIStackView的对齐方式无法正常工作

时间:2017-02-16 23:56:39

标签: ios objective-c alignment uistackview programmatically

我有什么:

这是我的观点层次结构:

  • 一个名为b1的按钮,其动作名为" changeAlignment"激活时触摸内部。
  • 一个名为Pview的UIView框架(0,100,414,100)。
    • 一个名为S1的水平UIStackView,其alignment属性设置为" center"。此stackView已固定到pView的边框。
      • 一个名为S2的水平UIStackView,其alignment属性设置为" Fill"并且里面有两个标签。

我想做什么:

我想改变S1与#34; Center"的对齐方式。 to" Top"当我触摸按钮b1时。

我尝试了什么

- (void) changeAlignment {
  NSLog(@"P-%li",(long)S1.alignment);
  S1.alignment = UIStackViewAlignmentTop;
  NSLog(@"P-%li",(long)S1.alignment);
  [pView layoutIfNeeded];
}

这听起来很明显,但它不起作用!!有趣的是,它在某个时间起作用但突然停止工作。现在,当我点击b1时,S1的对齐会发生变化,但在视觉上它根本不会改变。

我尝试使用[self.view setNeedsLayout] [self.view layoutIfNeeded]甚至[S1 layoutIfNeeded],但这些都没有用。

我做错了什么?..它甚至有可能实际工作并突然停止工作!! ??

任何人都可以帮助我吗?......这让我发疯了。

1 个答案:

答案 0 :(得分:0)

我认为这个答案与How to programmatically animate the alignment property of an UIStackView in ios 9中的答案相同。

此行为的解释如下:(1)stackView自动生成所需的约束以布置其排列的子视图,(2)将另一个stackView S2定义为水平堆栈视图S1作为S1的排列子视图,使S1创建一些约束(a)不受影响,(b)不重新计算或(c)重新计算但保持不变,当您将S1的对齐属性从中心更改为顶部时,反之亦然。因此,由于自动生成的约束S1不会受到影响,或者在更改对齐属性后根本不会更改,因此UI不会反映任何更改,也没有动画。如果有人想出另一个解释让我知道。