在新的xcode layoutSubviews中不会调用

时间:2017-10-19 08:58:27

标签: ios xcode9 iphone-x layoutsubviews

我有代码为视图设置动画(更改约束)

UIView .animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {

        self.topConstraint!.constant = self.yPositioOfOpenPanel
        self.superview?.layoutIfNeeded()

    }

奇怪的行为是在iPhone X layoutSubviews被调用,但在其他模拟器和真实设备上没有。 (而且我认为应该是这样)

当我手动更改约束时,行为相同

if let constraint = topConstraint {
            constraint.constant = self.superview!.frame.height - recogniser.location(in: self.superview).y + yPositionOfBeginTouchInPanel
        }

编辑:

正如所建议我添加一些新信息。

动画效果很好,一切都是动画应有的。

问题是我想在动画到位时触发一些新事件。 (我会使用topConstraint.constant在动画到位时计算某些东西,或者当我手动更改topConstraint时)这就是为什么我想在方法layoutSubviews上设置一些触发器。当动画更改子视图时,应触发此方法。

我认为这在iOS 11之前有效(但我不能100%肯定,因为这个功能在我的程序中是新的,但我记得我在其他程序中使用它并且它有效)。它仍适用于iPhone X(模拟器),但不适用于其他模拟器或真实设备(显然真正的iPhone X还没有出现)。

2 个答案:

答案 0 :(得分:1)

我认为您应该稍微更改动画代码:

// update constraints before you call animate
self.topConstraint!.constant = self.yPositioOfOpenPanel
// tell superview that the layout will need to be updated
self.superview?.setNeedsLayout()

UIView.animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
    // here you tell it to update the layout according to new constraints
    self.superview?.layoutIfNeeded()
}

答案 1 :(得分:0)

事实证明我需要做的是:

UIView .animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {

        self.topConstraint!.constant = self.originalConstraintConstant
        self.superview?.layoutIfNeeded()
        self.layoutIfNeeded()

    }

这会在此视图中触发layoutIfNeeded

但我仍然不知道为什么这适用于所有iPhone,其他只适用于iPhone X.它应该是iOS或Xcode中的错误。