Проблема с этим кодом:
@IBAction func clicked(_ sender: Any) {
createLabel()
clearLabel()
}
Есть две проблемы.Во-первых, вы делаете анимацию и удаление еще до того, как даете метке шанс стать частью интерфейса.Вам нужно ввести задержку (вы можете использовать мою delay
утилиту, https://stackoverflow.com/a/24318861/341994):
@IBAction func clicked(_ sender: Any) {
createLabel()
delay(0.1) {
clearLabel()
}
}
Вторая проблема, как вы правильно сказали, состоит в том, что у вас есть одна label
переменная экземпляра, котораявы используете, чтобы разделить метку между createLabel
и clearLabel
. Таким образом, другая метка не может появиться во время анимации.
Но на самом деле не нужна любая переменная экземпляра.полностью избавьтесь от вашего объявления label
Вместо этого измените createLabel
так, чтобы он на самом деле создал метку (то есть вызывает UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
) как локальную переменную, а затем возвращает ссылку на метку, которую он создает, например:
func createLabel() -> UILabel {
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
// ...
return label
}
... И затем просто clearLabel
принимает эту такую же метку как параметр , чтобы он перемещал эту метку и удалял ее в конце анимации, например:
func clearLabel(_ label : UILabel) {
// ...
}
Ваша реализация clicked
будет выглядеть следующим образом, передавая метку из createLabel
и в clearLabel
:
@IBAction func clicked(_ sender: Any) {
let label = self.createLabel()
delay(0.1) {
self.clearLabel(label)
}
}
(Остальные детали модификации createLabel
и clearLabel
для выполнения этой работы оставлены читателю в качестве упражнения.)
Теперь каждое нажатие на кнопку создает и анимирует и удаляет новый ярлык, независимо от того, что еще могло случиться раньше.