首页 > 解决方案 > 扩展中的 Swift 动画约束

问题描述

下面是我用来移动和缩小标签的代码。在我把它变成一个扩展之前它工作得很好。现在属性动画但不是约束。我已经多次看到同样的问题被问过,但解决方案似乎都很简单,而且没有一个有效。我已经尝试将约束常量以及layoutIfNeeded() 移动到动画上方、alpha 设置下方、上方和下方……没有运气。

extension UIView {
   func moveLabel(lc: NSLayoutConstraint, hc: NSLayoutConstraint) {
      lc.constant = -1
      hc.constant = 24
      UIView.animate(withDuration: 0.5, delay: 0, options: [.curveEaseInOut], animations: {
         self.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)
         self.alpha = 0.5
         self.layoutIfNeeded()
      }, completion: nil)
   }
}

标签: swiftanimationconstraints

解决方案


因为你说“我用来移动和缩小标签”我怀疑你的问题是因为你调用self.layoutIfNeeded()标签本身,这将更新当前视图范围内的约束,但移动视图需要超级视图布置。作为测试,您也可以将其包含self.superview?.layoutIfNeeded()在动画块中,但如果您想确定,请将标签的超级视图传递给该函数并调用layoutIfNeeded()它。

extension UIView {
    func moveLabel(lc: NSLayoutConstraint, hc: NSLayoutConstraint, superView: UIView) {
      lc.constant = -1
      hc.constant = 24
      UIView.animate(withDuration: 0.5, delay: 0, options: [.curveEaseInOut], animations: {
         self.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)
         self.alpha = 0.5
         self.layoutIfNeeded()
         superView.layoutIfNeeded()
      }, completion: nil)
   }
}

ps 在您的代码中,您实际上并没有为约束设置动画,这是您的意图吗?


推荐阅读