У меня есть функция, которая переключается между UICollectionView:Как убедиться в том, что завершение будет называться в animateWithDuration()
func toggleCollectionView(target: NSObject, targetName:String){
self.view.userInteractionEnabled = false
if let tempTarget = target as? UICollectionView {
//if selected item is same as active one, won't do anything
if(targetName != activeToolbarName){
tempTarget.hidden = false
tempTarget.frame.origin.y = screenSize.height
UIView.animateWithDuration(0.4, delay: 0.0, options: .CurveEaseOut, animations: {
if let tempActiveToolbar = self.activeToolbar as? UICollectionView {
tempActiveToolbar.frame.origin.y = self.screenSize.height
}
tempTarget.frame.origin.y = self.screenSize.height - tempTarget.frame.height - self.selectorsContainer.frame.height
}, completion: { finished in
if let tempActiveToolbar = self.activeToolbar as? UICollectionView {
tempActiveToolbar.hidden = true
self.activeToolbar = target
self.activeToolbarName = targetName
self.view.userInteractionEnabled = true
}
})
}
}
}
Это срабатывает на несколько кнопки на экране, как это:
@IBAction func showFontsTool(sender: UIBarButtonItem) {
toggleCollectionView(fontsCV, targetName:"fontsCV")
}
Если пользователь нажимает на кнопки очень быстро, блок completion
не будет вызываться иногда, а self.view.userInteractionEnabled
не будет включен. Как я могу убедиться, что блок completion
будет вызываться всегда после запуска анимации?
Update
Исправлена функция, которая работает отлично:
func toggleCollectionView(target: NSObject, targetName:String){
if let tempTarget = target as? UICollectionView {
//if selected item is same as active one, won't do anything
if(targetName != activeToolbarName){
tempTarget.hidden = false
tempTarget.frame.origin.y = screenSize.height
if (runningAnimation == false){
runningAnimation = true
self.activeToolbarName = targetName
UIView.animateWithDuration(0.4, delay: 0.0, options: .CurveEaseOut, animations: {
if let tempActiveToolbar = self.activeToolbar as? UICollectionView {
tempActiveToolbar.frame.origin.y = self.screenSize.height
}
tempTarget.frame.origin.y = self.screenSize.height - tempTarget.frame.height - self.selectorsContainer.frame.height
}, completion: { finished in
if let tempActiveToolbar = self.activeToolbar as? UICollectionView {
tempActiveToolbar.hidden = true
self.activeToolbar = target
self.runningAnimation = false }
})
}
}
}
}
Забыла упомянуть. Я советую вам установить для параметра userInteraction значение false, только если вы уверены, что собираетесь поменять его обратно на true ... Вы должны поместить его прямо перед вызовом 'UIView.animate'. –