键盘动画曲线为Int

时间:2014-11-14 21:23:34

标签: ios swift keyboard uiviewanimation uiviewanimation-curve

我试图获得键盘的UIAnimationCurve(如果存在)。我正在使用的代码如下:

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

但是,作为UIViewAnimationCurve的animateCurve无法从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'的重载。”

3 个答案:

答案 0 :(得分:15)

您可以使用

从原始Int值中获取枚举值
animateCurve = UIViewAnimationCurve(rawValue: kbCurve)

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

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

更新以回答已修改的问题:

您可以在动画选项中使用整数动画曲线值,方法是将其转换为UIViewAnimationOptions值:

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

Swift 1.2更新(XCode 6.3):

Swift 1.2的发行说明表明,具有未记录值的NS_ENUM类型现在可以从其原始整数值转换而不会重置为nil。因此,以下代码现在可以使用:

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)
  ...
}

答案 1 :(得分:0)

您应该使用较旧的API,非基于块的API。然后,您将能够设置动画曲线,您将从通知对象中获取该曲线。

答案 2 :(得分:0)

Swift 4版本:

if let curveValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber)?.uintValue {
    let curveAnimationOptions = UIViewAnimationOptions(rawValue: curveValue << 16)
    //...
}