iOS8中出现的键盘的animation速度是多less?

以下是在出现键盘时向上移动的textField和toolBar的animation。

baseConstraint.constant = 211 self.view.setNeedsUpdateConstraints() UIView.animateWithDuration(0.30, animations: { self.view.layoutIfNeeded() }) 

它接近但不完全相同。 你将如何修改上述animation?

编辑:

下面是使用下面的答案的最终代码!

  func keyboardWillShow(aNotification: NSNotification) { let duration = aNotification.userInfo.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as Double let curve = aNotification.userInfo.objectForKey(UIKeyboardAnimationCurveUserInfoKey) as UInt self.view.setNeedsLayout() baseConstraint.constant = 211 self.view.setNeedsUpdateConstraints() UIView.animateWithDuration(duration, delay: 0, options: UIViewAnimationOptions.fromMask(curve), animations: { self.view.layoutIfNeeded() }, completion: { (value: Bool) in println() }) } 

您可以从keyboardWillShow:notifications中的userInfo字典中获取animation持续时间和animation曲线。

首先登记通知

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 

然后从通知用户信息键中获取值。

 - (void)keyboardWillShow:(NSNotification*)notification { NSNumber *duration = [notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSNumber *curve = [notification.userInfo objectForKey: UIKeyboardAnimationCurveUserInfoKey]; // Do stuff with these values. } 

还有更多的这些键,你也可以从UIKeyboardWillDismiss通知中获取它们。

这个function可以回溯到iOS 3.0:D

下面是文档:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/doc/constant_group/Keyboard_Notification_User_Info_Keys

让我知道如果你需要帮助,使其工作。

Swift版本:

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) func keyboardWillShow(aNotification: NSNotification) { let duration = aNotification.userInfo.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as NSNumber let curve = aNotification.userInfo.objectForKey(UIKeyboardAnimationCurveUserInfoKey) as NSNumber } 

可变持续时间的答案是正确的,并在iOS 3到8,但与新版本的Swift,答案的代码不再工作。 也许这是我的错误,但我必须写:

 let duration = aNotification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as Double let curve = aNotification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as UInt self.view.setNeedsLayout() //baseConstraint.constant = 211 self.view.setNeedsUpdateConstraints() UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions(curve), animations: { _ in //self.view.layoutIfNeeded() }, completion: { aaa in //(value: Bool) in println() }) 

看起来像objectForKey不再工作,转换更严格。

swift3

  let duration = noti.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber let curve = noti.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber self.view.setNeedsLayout() UIView.animate(withDuration: TimeInterval(duration), delay: 0, options: [UIViewAnimationOptions(rawValue: UInt(curve))], animations: { self.view.layoutIfNeeded() }, completion: nil) 

//首先在你的类UITextFieldDelegate中声明委托

//放置在视图控制器的顶部

  // ****************** Keyboard Animation *************** var animateDistance = CGFloat() struct MoveKeyboard { static let KEYBOARD_ANIMATION_DURATION : CGFloat = 0.3 static let MINIMUM_SCROLL_FRACTION : CGFloat = 0.2; static let MAXIMUM_SCROLL_FRACTION : CGFloat = 0.8; static let PORTRAIT_KEYBOARD_HEIGHT : CGFloat = 216; static let LANDSCAPE_KEYBOARD_HEIGHT : CGFloat = 162; } // 

/ /复制和有害生物文本字段委托方法在你的课堂

 func textFieldDidBeginEditing(textField: UITextField) { let textFieldRect : CGRect = self.view.window!.convertRect(textField.bounds, fromView: textField) let viewRect : CGRect = self.view.window!.convertRect(self.view.bounds, fromView: self.view) let midline : CGFloat = textFieldRect.origin.y + 0.5 * textFieldRect.size.height let numerator : CGFloat = midline - viewRect.origin.y - MoveKeyboard.MINIMUM_SCROLL_FRACTION * viewRect.size.height let denominator : CGFloat = (MoveKeyboard.MAXIMUM_SCROLL_FRACTION - MoveKeyboard.MINIMUM_SCROLL_FRACTION) * viewRect.size.height var heightFraction : CGFloat = numerator / denominator if heightFraction > 1.0 { heightFraction = 1.0 } let orientation : UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown) { animateDistance = floor(MoveKeyboard.PORTRAIT_KEYBOARD_HEIGHT * heightFraction) } else { animateDistance = floor(MoveKeyboard.LANDSCAPE_KEYBOARD_HEIGHT * heightFraction) } var viewFrame : CGRect = self.view.frame viewFrame.origin.y -= animateDistance UIView.beginAnimations(nil, context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION)) self.view.frame = viewFrame UIView.commitAnimations() } func textFieldDidEndEditing(textField: UITextField) { var viewFrame : CGRect = self.view.frame viewFrame.origin.y += animateDistance UIView.beginAnimations(nil, context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION)) self.view.frame = viewFrame UIView.commitAnimations() } func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() return true } 

首先,select的答案是正确的路要走。

更多的可以在这里提供的是什么animation真的是。 如果您在UIViewAnimation块中打印所有CAAnimations, 在将animation曲线设置为键盘通知中提供的animation曲线时,您会发现这是一个CASpringAnimation 。 持续时间是0.5,其他参数是:

 let ani = CASpringAnimation(keyPath: someKey) ani.damping = 500 ani.stiffness = 1000 ani.mass = 3 ani.duration = 0.5 

上面的代码可以精确地再现animation。

一旦animation曲线设置为键盘animation,UIViewanimation将忽略参数的持续时间。 (如果你真的想改变持续时间,请调整mass值。)

我想指出一些在解决这个问题时绊倒我的东西。 由于新的“quickype”视图和显示/隐藏function(仅适用于iOS8),我需要键盘的大小 。 这就是我最终解决的问题:

 - (void)keyboardWillChangeFrame:(NSNotification *)notification { NSValue *value = notification.userInfo[UIKeyboardFrameEndUserInfoKey]; self.keyboardFrame = [value CGRectValue]; NSTimeInterval duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; [UIView animateWithDuration:duration animations:^{ //ANIMATE VALUES HERE }]; 

}

 //-------------------------------------------------------------- // MARK: - // MARK: - UITextFieldDelegate //-------------------------------------------------------------- //To trigger event when user types in fields //right click in IB and choose EditingChanged >> textField_EditingChanged //NOTE IF KEYBOARD NOT SHOWING IN SIMULATOR and no view appearing ITS TURNED OFF BY DEFAULT SO YOU CAN TYPE WITH YOUR MAC KEYBOARD - HIT CMD+K or Simulator > Menu > Toggle Software Keyboard... @IBAction func textField_EditingChanged(textField: UITextField) { //if more than one search if(textField == self.textFieldAddSearch){ appDelegate.log.error("self.textFieldAddSearch: '\(self.textFieldAddSearch.text)'") if textField.text == ""{ }else{ callJSONWebservices(textField.text) } }else{ appDelegate.log.error("textFieldDidBeginEditing: unhandled textfield") } } //TWO WAYS TO HIDE THE VIEW //textFieldShouldReturn //buttonCancel_Action //USER HIT RETURN BUTTON ON keyboard >> resignFirstResponder >> triggers keyboardWillHide func textFieldShouldReturn(textField: UITextField)-> Bool{ //triggers keyboardWillHide: which also fades out view self.textFieldAddSearch.resignFirstResponder() return false } //-------------------------------------------------------------- // MARK: - // MARK: - KEYBORAD //-------------------------------------------------------------- private func subscribeToKeyboardNotifications() { NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) } private func unsubscribeFromKeyboardNotifications() { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } func keyboardWillShow(notification: NSNotification) { if let userInfo = notification.userInfo { if let heightKeyboard = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().height { if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey]?.doubleValue { self.viewAddNewSearchResults.alpha = 0.0 self.viewAddNewSearchResults.hidden = false if let curve = userInfo[UIKeyboardAnimationDurationUserInfoKey]?.integerValue { appDelegate.log.info("keyboardWillShow: duration:\(duration)") UIView.animateWithDuration(duration, delay:0.0, options: .CurveEaseInOut, animations: { //self.view.frame = CGRectMake(0, 0, Geo.width(), Geo.height() - height) self.viewAddNewSearchResults_BottomConstraint.constant = heightKeyboard; self.viewAddNewSearchResults.alpha = 1.0 }, completion: nil) } } } } } func keyboardWillHide(notification: NSNotification) { if let userInfo = notification.userInfo { if let heightKeyboard = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().height { if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey]?.doubleValue { if let curve = userInfo[UIKeyboardAnimationDurationUserInfoKey]?.integerValue { appDelegate.log.info("keyboardWillHide: duration:\(duration)") UIView.animateWithDuration(duration, delay:0.0, options: .CurveEaseInOut, animations: { self.viewAddNewSearchResults_BottomConstraint.constant = 0; self.viewAddNewSearchResults.alpha = 0.0 }, completion: nil) } } } } } //Add button shows search result panel below search text fields //just set focus in the textField //then the keyboardWillShow will fade in the view and resize it to fit above the keyboard //and match fade in duration to animation of keyboard moving up @IBAction func buttonAdd_Action(sender: AnyObject) { //triggers keyboardWillHide: which also fades out view self.textFieldAddSearch.resignFirstResponder() } //TWO WAYS TO HIDE THE VIEW //textFieldShouldReturn //buttonCancel_Action //Cancel on the search results - just resignFirstResponder >> triggers keyboardWillHide: which also fades out view @IBAction func buttonCancel_Action(sender: AnyObject) { //triggers keyboardWillHide: which also fades out view self.textFieldAddSearch.resignFirstResponder() }