Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: NSNumber is not a subtype of UIViewAnimationCurve

How do I get the line below to compile?

UIView.setAnimationCurve(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)

Right now, it gives the compile error:

'NSNumber' is not a subtype of 'UIViewAnimationCurve'

Why does the compiler think userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue is an NSNumber when integerValue is declared as an Int?

class NSNumber : NSValue {
    // ...
    var integerValue: Int { get }`?
    // ...
}

I've had similar issues with other enum types. What is the general solution?

like image 986
ma11hew28 Avatar asked Jun 22 '14 15:06

ma11hew28


2 Answers

UIView.setAnimationCurve(UIViewAnimationCurve.fromRaw(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!)

Read more: Swift enumerations & fromRaw()

UPDATE

Based on this answer to How to use the default iOS7 UIAnimation curve, I use the new block-based animation method, + animateWithDuration:delay:options:animations:completion:, and get the UIViewAnimationOptions like so:

let options = UIViewAnimationOptions(UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).integerValue << 16))
like image 67
ma11hew28 Avatar answered Nov 05 '22 17:11

ma11hew28


I used the below code to construct an animation curve value from the user info dictionary:

let rawAnimationCurveValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).unsignedIntegerValue
let keyboardAnimationCurve = UIViewAnimationCurve(rawValue: rawAnimationCurveValue)
like image 39
Ryan Avatar answered Nov 05 '22 16:11

Ryan