2015-03-27 3 views
0

У меня есть анимация, и когда она заканчивается, я хочу удалить ее из своего супервизора. Однако я просто не могу обойти синтаксис обработчика завершения для Swift. Эта анимация написана в подклассе UIView.Как написать обработчик завершения в Swift с анимацией.

UIView.animateWithDuration(0.5, 
     delay: 0.0, 
     options: .CurveEaseInOut, 
     animations: { self.frame = CGRectMake(0,0, 500, 500)}, 
     completion: /*Magic Code here??*/) 

Я хочу назвать self.removeFromSuperView() в качестве параметра для completion, однако после прочтения многих статей в Интернете я до сих пор не могу этого добиться.

Спасибо!

ответ

5
UIView.animateWithDuration(0.5, 
    delay: 0.0, 
    options: .CurveEaseInOut, 
    animations: { self.frame = CGRectMake(0,0, 500, 500) }, 
    completion: { [weak self] finished in 
     self?.removeFromSuperview() 
    }) 

Замыкание завершения принимает один аргумент, Bool (так называемого finished в коде выше), указывающие, действительно ли завершена анимация, или была прервана.

Это стоит учесть, что, поскольку вы ссылаетесь self в замыкании завершения, то возможно *, что анимация может повлиять на срок службы вашего зрения (считают, что анимация все еще работает, когда представление будет в противном случае должны быть высвобождены, но сильная ссылка закрытия сохраняет представление живым). По этой причине я включил список захвата, чтобы обеспечить слабую ссылку на self.

* Возможно, но возможно маловероятно ... представление должно быть освобождено только в ответ на удаление из иерархии представлений, что я ожидаю, что явным образом отменим анимацию и вызову закрытие закрытия с помощью finished == false. Тем не менее, я лично ошибаюсь на стороне осторожности и в любом случае включаю [weak self], потому что я параноик.

+0

Приятно иметь в виду, но в этом случае вам не нужно использовать [unowned self], потому что вы не создаете ссылку в себе для анимации. – Sam

+0

Существует ссылка на 'self' как в анимации, так и в завершении закрытия (так что также должен быть список захвата в закрытии анимации, на самом деле). – Stuart

+0

Чтобы создать цикл, я также должен будет сохранить ссылку на анимацию или закрытие, чего нет здесь. Например, если вы должны назначить параметр закрытия для свойства класса, вам придется беспокоиться о сильном эталонном цикле. – Sam

2
UIView.animateWithDuration(0.5, 
    delay: 0.0, 
    options: .CurveEaseInOut, 
    animations: { self.frame = CGRectMake(0,0, 500, 500)}, 
    completion: { complete in 
     self.removeFromSuperview() 
    }) 
1
UIView.animateWithDuration(0.5, 
     delay: 0.0, 
     options: .CurveEaseInOut, 
     animations: { self.frame = CGRectMake(0,0, 500, 500)}, 
     completion: { _ in self.removeFromSuperview() }) 
0

UIView.animateWithDuration (0,5, задержка: 0.1, опции: .CurveEaseInOut, анимации: {self.frame = CGRectMake (0,0, 500, 500)}, завершение: { _ in self.removeFromSuperview()})

Смежные вопросы