我有使视图动画化的代码(更改约束)

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尚未推出)。

最佳答案

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

// 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()
}

关于ios - 在新的xcode layoutSubviews中不被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46826208/

10-12 06:57