2016-12-16 54 views
2
用“无主”

所以我一直都在做一些阅读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]在'它的一部分。任何人都可以解释我们使用它的目的吗?

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

完整代码如下:

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

} 

回答

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

  2. 我们可以用unowned代替weak,因为我们可以肯定的是selfanimator被破坏在一起,当self被释放,动画不会被任何更多的跑动。

+0

Okey cool thanks!你是否也知道这部分是什么?:“[unowned self,redBox] in”是否只是某种完成处理程序与我们正在使用的实例数组? –

+1

@LordFresh它不是一个数组,它被称为'捕获列表'。请参阅https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID57 – Sulthan