NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失

Posted

技术标签:

【中文标题】NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失【英文标题】:UIViewPropertyAnimator for NSLayoutConstraints makes view disappear 【发布时间】:2019-02-03 04:44:05 【问题描述】:

我有一个 UIViewPropertyAnimator,我在 viewDidAppear 中这样设置:

if animator == nil 
    animator = UIViewPropertyAnimator(duration: 5.0, curve: .easeInOut, animations:  [weak self] in
        guard let blockSelf = self else  return 
        blockSelf.primaryPromptLabel.alpha = 0
        blockSelf.secondaryPromptLabel.alpha = 0
        blockSelf.backArrowButton.alpha = 1
        NSLayoutConstraint.activate(blockSelf.constraintsToAdd ?? [])
        NSLayoutConstraint.deactivate(blockSelf.constraintsToRemove ?? [])
        blockSelf.view.layoutIfNeeded()
    )

我正在使用动画器在两组相互排斥的约束之间进行插值。我将库Pulley 用于抽屉,当抽屉被拖动时,UIViewPropertyAnimator 的fractionComplete 会根据用户在 Pulley 库的 drawerChangedDistanceFromBottom 函数中向上移动抽屉的距离进行更新,如下所示:

// Extension to clamp a value within bounds
extension ClosedRange 
    func clamp(_ value : Bound) -> Bound 
        return self.lowerBound > value ? self.lowerBound
            : self.upperBound < value ? self.upperBound
            : value
    


// PulleyDrawerViewControllerDelegate in my view controller
func drawerChangedDistanceFromBottom(drawer: PulleyViewController, distance: CGFloat, bottomSafeArea: CGFloat) 
    let bottomSafeSpace = drawer.bottomSafeSpace
    let expandedHeight = drawer.visibleDrawerHeight
    let partialHeight = drawer.partialRevealDrawerHeight(bottomSafeArea: bottomSafeSpace)

    let percentExpanded = (0.0 ... 1.0).clamp(1 * (drawer.drawerDistanceFromBottom.distance-partialHeight) / (expandedHeight-partialHeight))

    animator?.fractionComplete = percentExpanded

所描述的过程按预期工作,直到用户进入后台并返回应用程序。那时,我用约束制作动画的视图似乎只是消失了。我看到另一个问题表明 UIViewPropertyAnimator does strange things with the lifecycle。也许是这样的事情导致了问题?

我也从不开始/完成动画师,我只是在drawerChangedDistanceFromBottom 中更新fractionComplete,也许我应该?虽然我不希望动画以 5 秒的持续时间实际运行,但我只想要一个可擦洗的动画。

【问题讨论】:

【参考方案1】:

我不确定问题的原因,但我添加的约束之一是主要和次要标签的 height = 0 约束。标签也在堆栈视图中。我从堆栈视图中删除了标签,但仍然遇到同样的问题。现在,我通过将动画更改为 CGAffineTransform 进行翻译而不是添加 height = 0 约束来克服这个问题。使用CGAffineTransform 进行缩放时它不起作用(无论我是否将标签放在堆栈视图中)。

如果有人有更好的建议,请告诉我。

【讨论】:

以上是关于NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 的标题视图上使用 NSLayoutConstraints

NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失

Swift 中的尾随和前导约束以编程方式 (NSLayoutConstraints)

Swift 中 NSLayoutConstraints 的奇怪行为

在 Swift 中枚举视图的 NSLayoutConstraints?

使用 NSLayoutConstraints 时的警告