【问题标题】:What is the relation between auto-layout and viewAnimation?自动布局和viewAnimation有什么关系?
【发布时间】:2016-11-20 01:58:30
【问题描述】:
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.animate(withDuration: 0.5, animations: {
        self.animateLabel.center.x += 30
    })
}

上标签:水平和垂直的中心。 下标签:与上标签对齐,垂直空间与上标签对齐。

然后我将上面的代码放在 ViewController 中,为上面的标签设置动画:

然后运行模拟器。

如您所见,这两个标签不再对齐。这是否意味着我之前设置的自动布局规则被打破了? 然而,当我旋转模拟器时,上面的标签会回到中心。 自动布局和viewAnimation是什么关系?

【问题讨论】:

    标签: ios


    【解决方案1】:

    问题不是动画本身,而是直接更改视图的frame 导致您的问题。

    本质上,自动布局使用您设置的约束来计算每个视图的框架。当您直接修改frame(或通过修改center 属性隐式修改)时,您实际上覆盖了自动布局过程的结果,并且视图被重新定位。

    任何导致自动布局过程再次运行的事情都将导致根据约束重新计算框架。旋转设备会导致这样的重新计算,就像调用self.animateLabel.setNeedsLayout一样。

    当你使用自动布局时,你不应该直接重新定位视图;你应该修改约束,然后触发自动布局来移动视图。

    假设您使用的是故事板,您应该为上部标签的水平中心约束创建一个@IBOutlet。然后你可以为这个约束设置动画:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.animateLabel.layoutIfNeeded()   // Ensure auto layout is complete
        self.labelCentreConstraint.Constant = 30
        UIView.animate(withDuration: 0.5, animations: {
            self.animateLabel.layoutIfneeded()   // Recalculate auto layout
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多