Увеличение параметра в UIView.animateWithDuration в Swift

У меня есть коллекция кнопок IBOutlet, которые я пытаюсь последовательно отображать на экране. Все они начинаются с экрана нормально, но по мере их анимации я бы хотел, чтобы каждая кнопка отображалась на экране через 0,05 секунды после предыдущей кнопки. Я не могу понять, как увеличить задержку в UIView.animateWithDuration. С приведенным ниже кодом все они анимируются на экране одновременно.

//outlet collection
@IBOutlet var options: [UIButton]!

let increment = 0.25

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    for button in options {
        button.center.y += view.bounds.height
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    for button in options {
        UIView.animateWithDuration(1.0, delay: increment, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
            button.center.y -= self.view.bounds.height
            self.increment + 0.05
            }, completion: nil)
    }
}

person Nacho    schedule 06.05.2015    source источник


Ответы (3)


for button in options {
        UIView.animateWithDuration(1.0, delay: increment, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
            button.center.y -= self.view.bounds.height
            }, completion: nil)

    }
           increment = increment + 0.05

}

Кроме того: изменить это

let increment = 0.25

To

   var increment = 0.25

Увеличьте increment внешнюю анимацию. Поскольку animateWithDuration является асинхронным методом, он возвращается первым. Итак, все ваши кнопки имеют одинаковую задержку.

person Leo    schedule 06.05.2015
comment
Спасибо за отзыв. Почему-то до сих пор не работает. Я переместил приращение за пределы анимации, как вы предложили, но все кнопки по-прежнему анимируются на экране вместе. Я также переместил все в viewDidAppear и попробовал его там, но он все еще не работает. - person Nacho; 06.05.2015

@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!

@IBOutlet var options: [UIButton]!

let increment = 0.25


override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    for button in options {
        button.center.y += view.bounds.height

    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

        for button in options {
            UIView.animateWithDuration(1.0, delay: increment, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
                button.center.y -= self.view.bounds.height
                }, completion: nil)

            self.increment + 0.05
    }
}

Также возникает ошибка «Невозможно вызвать '+=' со списком аргументов типа '(Double, FloatLiteralConvertible)'» при использовании +=, но это займет всего +

person Nacho    schedule 06.05.2015
comment
Смотрите мои обновления, если вы установите свойство как let, его нельзя будет изменить - person Leo; 06.05.2015
comment
Вы должны отредактировать свой вопрос, а не добавлять его в качестве ответа - это не ответ - person jrturton; 06.05.2015
comment
Это сработало! Я продолжал думать, что делаю что-то неправильно с циклом for, но полностью пропустил константу. Спасибо! @jrturton, первый пост, спасибо за внимание. - person Nacho; 07.05.2015

Вот способ добиться необходимой задержки между анимациями:

var i! as UInt64;
i = 0
for button in options {
                // your animation with delay
        UIView.animateWithDuration(1.0, delay: (i *0.05), usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: nil, animations: {
            button.center.y -= self.view.bounds.height
            }, completion: nil)
    })
    ++i

}
person Vijay Masiwal    schedule 06.05.2015
comment
Прямо в методе анимации есть параметр delay, зачем вам возиться с GCD для этого? - person jrturton; 06.05.2015