Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 8 keyboard hides my textview

Tags:

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?

like image 575
Alessio Crestani Avatar asked Oct 06 '14 09:10

Alessio Crestani


2 Answers

@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.

like image 114
newton_guima Avatar answered Oct 12 '22 21:10

newton_guima


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) 
like image 44
myles Avatar answered Oct 12 '22 22:10

myles