gpt4 book ai didi

swift - 以编程方式为约束设置动画 Swift 3

转载 作者:行者123 更新时间:2023-11-28 15:24:56 25 4
gpt4 key购买 nike

我有一个 View ,我已经通过约束设置了位置和大小:

    oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true
oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true
oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -overlaySpacing).isActive = true
oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -overlaySpacing).isActive = true

但是,我希望 oV( View )开始时比这个小,并在一秒钟内动画到最终大小。

oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true
oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true
oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -2 * overlaySpacing).isActive = true
oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -2 * overlaySpacing).isActive = true

我写的初始约束是常量为 (-2 * overlaySpacing) 的约束。最后的约束条件是宽度/高度常量只是 -overlaySpacing。

我已经以编程方式编写了所有内容,因此 Storyboard 解决方案无济于事。

这是我当前要制作动画的代码,但它只是自动显示为最终约束:

让 oV = NewOverlayView(viewController: mVC, frame: CGRect.zero)

    self.mapViewController.view.addSubview(oV)

oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true
oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true
var widthConstraint = oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -2 * overlaySpacing)
var heightConstraint = oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -2 * overlaySpacing)

widthConstraint.isActive = true
heightConstraint.isActive = true

oV.layoutIfNeeded()

widthConstraint.isActive = false
heightConstraint.isActive = false

widthConstraint = oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -overlaySpacing)
heightConstraint = oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -overlaySpacing)

widthConstraint.isActive = true
heightConstraint.isActive = true

UIView.animate(withDuration: 1.0) { oV.layoutIfNeeded() }

谢谢!

最佳答案

属性(property)观察员 proper function对于动画可以是一个解决方案:

1.

使用“didSet”观察器在您的 Controller 中设置一个变量,如下所示:

    var dynamicOverlaySpacing = 0 {
didSet {
//Remove previous constraints ?
oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -dynamicOverlaySpacing).isActive = true
oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -dynamicOverlaySpacing).isActive = true
}
}


每当 dynamicOverlaySpacing 的值发生变化时,都会执行 didSet 闭包中的代码。

2.

创建一个会缓慢改变 dynamicOverlaySpacing 值的动画

像这样的东西应该可以工作:

let delay = 2.0 //the delay you want for the animation
let firstOverlaySpacing = dynamicOverlaySpacing
oV.animate(withDuration: 0, delay: delay, options: .curveEaseIn, animations: {
dynamicOverlaySpacing = -2*firstOverlaySpacing

}, completion: nil)

在选项上,我使用 curseEaseIn。您可以看到所有可用选项 here.

我没有尝试代码,但它应该可以工作。

关于swift - 以编程方式为约束设置动画 Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45405357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com