Идея кода здесь состоит в том, чтобы удалить представление (self.mv
), когда оно было анимировано вне экрана с помощью UIDynamicAnimator
.
Код ниже основан на примерах из главы 4Книга Программирование iOS 12 от Мэтта Нойбурга.Автор говорит, что и поведение, и представление (self.mv
в коде) не будут отменены.Но он не стал подробно останавливаться на этом.
Мои вопросы:
Кто все еще сохраняет поведение после self.anim.removeAllBehaviors()
?
Кто все еще сохраняет self.mv
?
Я использовал инструменты, но я не совсем понимаю вывод.Значит ли это, что аниматор его сохраняет?Но есть только зеленые галочки.
С помощью инструмента «Debug Memory Graph» в XCode я увидел, что UIGravityBehavior
все еще сохраняется аниматоромдаже после вызова self.anim.removeAllBehaviors()
.
class MyView : UIView {
deinit {
print("dddddddd")
}
}
class ViewController: UIViewController {
var anim : UIDynamicAnimator!
weak var mv : MyView?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let v = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
v.backgroundColor = .red
self.view.addSubview(v)
self.mv = v
let grav = UIGravityBehavior()
self.anim = UIDynamicAnimator(referenceView: self.view)
self.anim.addBehavior(grav)
grav.action = {
let items = self.anim.views(in: self.view.bounds)
let idx = items.firstIndex(of: self.mv!)
if idx == nil {
self.anim.removeAllBehaviors()
self.mv!.removeFromSuperview()
// self.anim = nil // without this, the `MyView` is not deallocated.
}
}
grav.addItem(v)
}
}