0

是)我有的:

这是我的视图层次结构:

  • 一个名为 b1 的按钮,该按钮具有一个名为“changeAlignment”的操作,该操作在 touch Up Inside 时被激活。
  • 一个名为 Pview 的 UIView,带有框架 (0,100,414,100)。
    • 一个名为 S1 的水平 UIStackView,其对齐属性设置为“中心”。此 stackView 已固定到 pView 的边框。
      • 一个名为 S2 的水平 UIStackView,其对齐属性设置为“填充”,其中包含两个标签。

我想做的事:

当我触摸按钮 b1 时,我想将 S1 的对齐方式从“中心”更改为“顶部”。

我试过的

- (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],但这些都不起作用。

我做错了什么??..它怎么可能真的起作用并突然停止工作!??

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

4

1 回答 1

0

我认为这个答案与How to programmatically 在 ios 9 中以编程方式为 UIStackView 的对齐属性设置动画相同。

对此行为的解释如下:(1)一个stackView自动生成它需要的约束来布局其排列的子视图,(2)定义一个水平的stackview S1和另一个stackView S2作为S1的一个排列的子视图,使S1当您将 S1 的对齐属性从 Center 更改为 Top 时,创建一些约束 (a) 不受影响,(b) 不重新计算或 (c) 重新计算但保持不变,反之亦然。因此,由于 S1 自动生成的约束在更改对齐属性后不受影响或根本没有变化,因此 UI 不会反映任何变化,也没有动画。如果有人想出另一种解释,请告诉我。

于 2017-03-09T00:24:34.910 回答