2014-11-14 58 views
2

我想获得键盘的UIAnimationCurve,如果存在的话。我使用的代码如下:键盘动画曲线为真

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曲线?

企图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'? – 2014-11-14 21:33:49

+0

@IanMacDonald不​​能编译。这个错误是不能预见的,因为我已经注意到XCode经常出现这种情况,但是7与枚举不匹配(参见下面的nickgraef的回复) – steventnorris 2014-11-14 21:51:32

回答

12

您可以从原始Int值与

animateCurve = UIViewAnimationCurve(rawValue: kbCurve) 

但是得到一个枚举值,标准键盘采用的7动画曲线值,这可能不是一个枚举值匹配,所以animateCurvenil。如果是这种情况,只需将animateCurve定义为Int并在代码中使用原始值而不是枚举值。

此外,快速谷歌搜索打开了这个包装,这可能对你有用:https://gist.github.com/kristopherjohnson/13d5f18b0d56b0ea9242

更新回答编辑的问题:

您可以在动画中使用的整动画曲线值选项通过将其转换为UIViewAnimationOptions值:

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

更新夫特1.2(6.3的XCode):

Swift 1.2的发行说明表明,具有未记录值的NS_ENUM类型现在可以从其原始整数值转换而不被重置为nil。所以,下面的代码将现在的工作:

为雨燕2.2(7.3的XCode) ​​

更新:

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

你是对的。匹配一个枚举。但是,当我尝试执行上述操作(请参阅编辑后)时,它在UIView.setAnimationCurve上发生错误。 – steventnorris 2014-11-14 21:49:53

+0

@steventnorris我已经更新了我的答案,以展示如何使用7值作为动画曲线。 – nickgraef 2014-11-14 22:08:03

+0

我试过你的解决方案,但得到了一个编译器错误。我已经调整了上面的帖子。 – steventnorris 2014-11-14 22:12:39

0

你应该使用较旧的API,非基于块的一个。然后你就可以设置动画曲线,你将从通知对象中获得动画曲线。