У меня есть «казино-машина» в моем приложении для iOS с 3 UIPickerView
объектами.
Когда моя кнопка нажата, эта функция запускается в каждом сборщике (я создал свой собственный UIPickerView
подборщик классов):
func selectRandomRow()
{
// Aller à la ligne numéro randomNumber
let randomRow = FDUtils.shared.random(min: 1, max: self.pickerDataSize - 2)
if (self.selectedRow(inComponent: 0) != 0)
{
goToRow(valueToGo: randomRow)
}
else
{
self.selectRow(randomRow, inComponent: 0, animated: false)
}
}
goToRow
Функция:
func goToRow(valueToGo: Int)
{
FDUtils.shared.delay(0.1, closure:
{
let currentRow = self.selectedRow(inComponent: 0)
if (currentRow > valueToGo)
{
self.selectRow(currentRow - 1, inComponent: 0, animated: true)
self.goToRow(valueToGo: valueToGo)
}
else if (currentRow < valueToGo)
{
self.selectRow(currentRow + 1, inComponent: 0, animated: true)
self.goToRow(valueToGo: valueToGo)
}
else if (currentRow == valueToGo)
{
print("currentRow == valueToGo")
self.isUserInteractionEnabled = false
self.delegateGame.didRowSelected()
}
})
}
Моя функция FDUtils.shared.delay:
func delay(_ delay:Double, closure:@escaping ()->())
{
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
Когда каждый сборщик сделан (Я считаю готовым, когда delegateGame.didRowSelected()
вызывается) У меня есть функция, которая показывает уведомление пользователю.Проблема в том, что если анимация включена, делегат вызывает функцию didRowSelected
до того, как анимация завершена.
Поэтому я отображаю уведомление до того, как последний селектор завершил прокрутку.
Как узнать, какова продолжительность анимации UIPickerView?(а затем установите задержку перед вызовом didRowSelected
, но я не уверен, что это чистое решение) или как я могу позвонить didRowSelected
после завершения анимации?