2014-11-14 2 views
2

Я пытаюсь получить UIAnimationCurve клавиатуры, если она существует. Код, я использую ниже:Кривая анимации клавиатуры как Int

if let kbCurve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? Int{ 
       animateCurve = UIViewAnimationCurve. 
      } 

Однако animateCurve, будучи UIViewAnimationCurve, не может быть преобразован из Int. Как мне получить кривую таким образом?

Если я рассматривать их как числа, не UIViewAnimationCurve перечислений, приведенные ниже ошибки при попытке анимации:

//Animated done button with keyboard 
     origDoneFrame = btnDone.frame 
     btnDone.hidden = false 
     UIView.animateWithDuration(
      animateDuration, 
      delay: Numbers.ANIMATE_DELAY, 
      options: nil, 
      animations: { 
       UIView.setAnimationCurve(animateCurve) 
       self.btnDone.frame = CGRectMake(self.btnDone.frame.origin.x + kbHeight, self.btnDone.frame.origin.y, self.btnDone.frame.size.width, self.btnDone.frame.size.height) 
       return Void() 
      }, 
      completion: {finished in 
       return Void() 
      } 
     ) 

Есть ли способ, чтобы установить кривую, используя Int?

Покушение ИНТ кривая:

UIView.animateWithDuration(
      animateDuration, 
      delay: Numbers.ANIMATE_DELAY, 
      options: UIViewAnimationOptions(animateCurve << 16), 
      animations: { 
       self.btnDone.frame = CGRectMake(self.btnDone.frame.origin.x + kbHeight, self.btnDone.frame.origin.y, self.btnDone.frame.size.width, self.btnDone.frame.size.height) 
       return Void() 
      }, 
      completion: {finished in 
       return Void() 
      } 
     ) 

Но компилировать ошибка возникает из-за UIViewAnimationOptions не является правильным типом. Если я запускаю назначение UIViewAnimationOptions на свой собственный, я получаю ошибку компилятора «Не удалось найти перегрузку для« init », которая принимает предоставленные аргументы».

+0

Вы пробовали использовать 'as? UIViewAnimationCurve' вместо этого? –

+0

@IanMacDonald Это не компилируется. Ошибка - это то, что не доходит до его фактической проблемы (как я заметил, часто бывает с XCode, но 7 не соответствует перечислению (см. Ответ ниже) – steventnorris

ответ

12

Вы можете получить значение перечисления из сырья Int значения с

animateCurve = UIViewAnimationCurve(rawValue: kbCurve) 

Однако стандартная клавиатура использует значение кривой анимации из 7, которая может не совпадать с значением перечисления, так animateCurve будет nil. Если это так, просто определите animateCurve как Int и используйте исходные значения в коде, а не значения перечисления.

Кроме того, быстрый поиск Google появился эта оберткой, которая может быть полезной для вас: https://gist.github.com/kristopherjohnson/13d5f18b0d56b0ea9242

Update, чтобы ответить на отредактированный вопрос:

Вы можете использовать значение кривого целого анимации в анимации варианты путем преобразования его в значение: UIViewAnimationOptions

UIViewAnimationOptions(kbCurve << 16) // where kbCurve: UInt 

обновления для Swift 1.2 (XCode 6.3):

Примечания к выпуску для Swift 1.2 показывают, что типы NS_ENUM с недокументированными значениями теперь могут быть преобразованы из их необработанных целых значений без сброса в нуль. Таким образом, следующий код теперь будет работать:

let animateCurve = UIViewAnimationCurve(rawValue: userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)! 

обновление для Swift 2.2 (XCode 7.3):

if let animationCurveInt = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber)?.unsignedIntegerValue { 
    let animationCurve = UIViewAnimationOptions(rawValue: animationCurveInt<<16) 
    ... 
} 
+0

Вы верны. совпадают с перечислением. Однако, когда я пытаюсь сделать выше (см. отредактированный пост), это ошибки в UIView.setAnimationCurve. – steventnorris

+0

@steventnorris Я обновил свой ответ, чтобы показать, как вы можете использовать значение 7 в качестве кривой анимации. – nickgraef

+0

Я пробовал ваше решение, но получил ошибку компилятора. Я скорректировал сообщение выше. – steventnorris

0

Вы должны использовать один старший API, основанный неблочный. Затем вы сможете установить анимационную кривую, которую вы получите из объекта уведомления.

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