I have a UIViewController
presented using self.accountViewController.modalPresentationStyle = UIModalPresentationFormSheet;
and now in iOS 8 the last UITextView
is hidden from the keyboard when it will pushed up. How to avoid It?
@Oleg's solution is good but it doesn't take into consideration keyboard changes in size while its already showing.. also, he hardcoded the animation duration and a few other parameters. See my solution below:
Add an observer of UIKeyboardWillChangeFrameNotification
to the viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
And then add the method:
- (void)keyboardFrameWillChange:(NSNotification *)notification { CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect keyboardBeginFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]; UIViewAnimationCurve animationCurve = [[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; NSTimeInterval animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] integerValue]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:animationDuration]; [UIView setAnimationCurve:animationCurve]; CGRect newFrame = self.view.frame; CGRect keyboardFrameEnd = [self.view convertRect:keyboardEndFrame toView:nil]; CGRect keyboardFrameBegin = [self.view convertRect:keyboardBeginFrame toView:nil]; newFrame.origin.y -= (keyboardFrameBegin.origin.y - keyboardFrameEnd.origin.y); self.view.frame = newFrame; [UIView commitAnimations]; }
Don't forget to remove the keyboard observer in both viewDidUnload and in Dealloc.
Swift Version of @newton_guima's answer above incase anyone wants it.
Add observer of UIKeyboardWillChangeFrameNotification
to viewDidLoad()
:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardFrameWillChange:", name: UIKeyboardWillChangeFrameNotification, object: nil)
Then add this method:
func keyboardFrameWillChange(notification: NSNotification) { let keyboardBeginFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue let keyboardEndFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue let animationCurve = UIViewAnimationCurve(rawValue: (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationCurveUserInfoKey)!.integerValue) let animationDuration: NSTimeInterval = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationDurationUserInfoKey)!.doubleValue UIView.beginAnimations(nil, context: nil) UIView.setAnimationDuration(animationDuration) UIView.setAnimationCurve(animationCurve!) var newFrame = self.view.frame let keyboardFrameEnd = self.view.convertRect(keyboardEndFrame, toView: nil) let keyboardFrameBegin = self.view.convertRect(keyboardBeginFrame, toView: nil) newFrame.origin.y -= (keyboardFrameBegin.origin.y - keyboardFrameEnd.origin.y) self.view.frame = newFrame; UIView.commitAnimations() }
Then remove the observer wherever you transition away from the view or in deinit
:
NSNotificationCenter.defaultCenter().removeObserver(self)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With