为什么要使用' unowned'在UIViewPropertyAnimator中

时间:2016-12-16 19:42:25

标签: swift uiviewpropertyanimator

所以我一直在做一些关于UIViewPropertyAnimator的阅读,在我一直在看的例子中,他们做了类似的事情:

animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations: { 
        [unowned self, redBox] in
        redBox.center.x = self.view.frame.width
        redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
    })

我不明白' [无主的自我,redBox]在'一部分。谁能解释一下我们用它做什么?

我知道无主通常用于决定如何确定引用计数,并且不能将其设置为nil,因为引用将不存在而没有另一个(作为弱的替代),但我不了解这里的使用,我不理解括号部分。它在我看来是一个动画项目的数组和它位于的视图?

完整代码如下:

import UIKit

class ViewController: UIViewController {

    var animator: UIViewPropertyAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        //redBox

        let redBox = UIView(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        redBox.translatesAutoresizingMaskIntoConstraints = false// lar oss redigere posisjon og sånn selv, uten at xcode setter posisjon/størrelse i stein.
        redBox.backgroundColor = .red
        redBox.center.y = view.center.y

        view.addSubview(redBox)

        animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations: { 
            [unowned self, redBox] in
            redBox.center.x = self.view.frame.width
            redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
        })

        // slider

        let slider = UISlider()
        slider.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(slider)
        slider.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        slider.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        slider.addTarget(self, action: #selector(sliderChanged), for: .valueChanged)

    }
    func sliderChanged(_ sender: UISlider){
        animator.fractionComplete = CGFloat(sender.value)
    }

}

1 个答案:

答案 0 :(得分:4)

  1. 我们需要使用weakunowned,否则将创建所有权(参考)周期(self => animator => { {1}} => animations)。

  2. 我们可以使用self代替unowned,因为我们可以确保将weakself一起销毁,并在animator解除分配时,动画不再运行。