Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>What you really want to do is observe the UIKeyboard(Did|Will)(Show|Hide) notifications. They contain in their userInfo dictionaries the beginning and ending frame, as well as the correct animation curve and durations.</p> <p>So after observing this notification, when it's posted move your text field based on the size of the frame passed in the notification, according to the animation hints provided.</p> <p>You can see more information in the UIWindow class reference's "notifications" section: <a href="https://developer.apple.com/library/ios/#documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html" rel="noreferrer">https://developer.apple.com/library/ios/#documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html</a></p> <p>Below is a sample view controller implementation. The nib for this view controller was just a single text field, with an outlet connected to it, and the text field's delegate set to the view controller.</p> <pre><code>@interface ViewController () - (void)viewControllerInit; @end @implementation ViewController @synthesize textField; - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self viewControllerInit]; } return self; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { [self viewControllerInit]; } return self; } - (void)viewControllerInit { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } #pragma mark - Notification Handlers - (void)keyboardWillShow:(NSNotification *)notification { // I'll try to make my text field 20 pixels above the top of the keyboard // To do this first we need to find out where the keyboard will be. NSValue *keyboardEndFrameValue = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey]; CGRect keyboardEndFrame = [keyboardEndFrameValue CGRectValue]; // When we move the textField up, we want to match the animation duration and curve that // the keyboard displays. So we get those values out now NSNumber *animationDurationNumber = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration = [animationDurationNumber doubleValue]; NSNumber *animationCurveNumber = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey]; UIViewAnimationCurve animationCurve = [animationCurveNumber intValue]; // UIView's block-based animation methods anticipate not a UIVieAnimationCurve but a UIViewAnimationOptions. // We shift it according to the docs to get this curve. UIViewAnimationOptions animationOptions = animationCurve &lt;&lt; 16; // Now we set up our animation block. [UIView animateWithDuration:animationDuration delay:0.0 options:animationOptions animations:^{ // Now we just animate the text field up an amount according to the keyboard's height, // as we mentioned above. CGRect textFieldFrame = self.textField.frame; textFieldFrame.origin.y = keyboardEndFrame.origin.y - textFieldFrame.size.height - 40; //I don't think the keyboard takes into account the status bar self.textField.frame = textFieldFrame; } completion:^(BOOL finished) {}]; } - (void)keyboardWillHide:(NSNotification *)notification { NSNumber *animationDurationNumber = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration = [animationDurationNumber doubleValue]; NSNumber *animationCurveNumber = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey]; UIViewAnimationCurve animationCurve = [animationCurveNumber intValue]; UIViewAnimationOptions animationOptions = animationCurve &lt;&lt; 16; [UIView animateWithDuration:animationDuration delay:0.0 options:animationOptions animations:^{ self.textField.frame = CGRectMake(20, 409, 280, 31); //just some hard coded value } completion:^(BOOL finished) {}]; } #pragma mark - View lifecycle - (void)viewDidUnload { [self setTextField:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self.textField resignFirstResponder]; return YES; } @end </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload