Vraag Hoe kan ik een UITextField omhoog laten komen als het toetsenbord aanwezig is?


Met de iOS SDK:

ik heb een UIView met UITextFields die een toetsenbord oproepen. Ik heb het nodig om:

  1. Sta toe dat u scrolt van de inhoud van de UIScrollView om de andere tekstvelden te zien zodra het toetsenbord wordt weergegeven

  2. Automatisch "springen" (door omhoog te scrollen) of inkorten

Ik weet dat ik een nodig heb UIScrollView. Ik heb geprobeerd de klas van mij te veranderen UIView naar een UIScrollView maar ik kan de tekstvakken nog steeds niet omhoog of omlaag schuiven.

Heb ik beide nodig? UIView en een UIScrollView? Gaat men binnen in de ander?

Wat moet er worden geïmplementeerd om automatisch naar het actieve tekstveld te scrollen?

Idealiter zal zoveel mogelijk van de setup van de componenten worden gedaan in Interface Builder. Ik wil alleen maar code schrijven voor wat het nodig heeft.

Merk op UIView (of UIScrollView) waarmee ik werk wordt opgevoed door een tabbar (UITabBar), die normaal moet functioneren.


Bewerken: ik voeg de schuifbalk toe alleen voor wanneer het toetsenbord verschijnt. Hoewel het niet nodig is, heb ik het gevoel dat het een betere interface biedt, omdat de gebruiker dan kan scrollen en tekstvakjes kan wijzigen, bijvoorbeeld.

Ik laat het werken waar ik de framegrootte van de UIScrollView wanneer het toetsenbord op en neer gaat. Ik gebruik gewoon:

-(void)textFieldDidBeginEditing:(UITextField *)textField { 
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
                     scrollView.frame.origin.y, 
scrollView.frame.size.width,
scrollView.frame.size.height - 215 + 50);   //resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   //keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
       scrollView.frame.origin.y, 
     scrollView.frame.size.width,
      scrollView.frame.size.height + 215 - 50); //resize
}

Dit gaat echter niet automatisch omhoog of centreert de onderste tekstvelden in het zichtbare gebied, wat ik echt zou willen.


1556


oorsprong


antwoorden:


  1. Je hebt alleen een ScrollView als de inhoud die u nu hebt niet op het scherm van de iPhone past. (Als u de ScrollView als superview van de componenten. gewoon om het te maken TextField omhoog scrollen wanneer het toetsenbord verschijnt, dan is het niet nodig.)

  2. Voor het tonen van de textfields zonder verborgen te zijn door het toetsenbord, is de standaardmanier het omhoog / omlaag gaan van de weergave met tekstvelden wanneer het toetsenbord wordt getoond.

Hier is een voorbeeldcode:

#define kOFFSET_FOR_KEYBOARD 80.0

-(void)keyboardWillShow {
    // Animate the current view out of the way
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)keyboardWillHide {
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if ([sender isEqual:mailTf])
    {
        //move the main view, so that the keyboard does not hide it.
        if  (self.view.frame.origin.y >= 0)
        {
            [self setViewMovedUp:YES];
        }
    }
}

//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // if you want to slide up the view

    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard 
        // 2. increase the size of the view so that the area behind the keyboard is covered up.
        rect.origin.y -= kOFFSET_FOR_KEYBOARD;
        rect.size.height += kOFFSET_FOR_KEYBOARD;
    }
    else
    {
        // revert back to the normal state.
        rect.origin.y += kOFFSET_FOR_KEYBOARD;
        rect.size.height -= kOFFSET_FOR_KEYBOARD;
    }
    self.view.frame = rect;

    [UIView commitAnimations];
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}

970



Ik had ook veel problemen met een UIScrollView componeren van meerdere UITextFields, waarvan er een of meer door het toetsenbord zouden worden bedekt tijdens het bewerken.

Hier zijn enkele dingen om te overwegen als uw UIScrollView is niet goed scrollen.

1) Zorg ervoor dat uw inhoudsgrootte groter is dan de UIScrollView kadergrootte. De manier om te begrijpen UIScrollViews is dat de UIScrollView is als een kijkvenster op de inhoud die is gedefinieerd in de inhoudsgrootte. Dus wanneer op voor de UIScrollview om overal naartoe te scrollen, moet de inhoudsgrootte groter zijn dan de UIScrollView. Anders is er geen scrollen vereist, omdat alles dat in de inhoudsgrootte is gedefinieerd, al zichtbaar is. BTW, default contentSize = CGSizeZero.

2) Nu dat je begrijpt dat het UIScrollView is echt een venster op je "inhoud", de manier om ervoor te zorgen dat het toetsenbord je niet verduistert UIScrollView's het bekijken van "window" zou zijn om de grootte van de UIScrollView zodat wanneer het toetsenbord aanwezig is, u de UIScrollView venster dat is afgestemd op alleen het origineel UIScrollView frame.size.hoogte minus de hoogte van het toetsenbord. Dit zorgt ervoor dat uw venster slechts dat kleine zichtbare gebied is.

3) Hier is de vangst: Toen ik dit voor het eerst implementeerde, dacht ik dat ik de CGRect van het bewerkte tekstveld en bel UIScrollView's scrollRecToVisible-methode. Ik heb het UITextFieldDelegate methode textFieldDidBeginEditing met de oproep naar de scrollRecToVisible methode. Dit werkte eigenlijk met een vreemd neveneffect dat het scrollen zou breuk de UITextField in positie. Voor de langste tijd kon ik er niet achter komen wat het was. Toen heb ik de opmerking gemaakt textFieldDidBeginEditing Delegate-methode en het werkt allemaal !! (???). Zoals later bleek, geloof ik het UIScrollView impliceert impliciet de momenteel bewerkte UITextField in het zichtbare venster impliciet. Mijn implementatie van de UITextFieldDelegate methode en daaropvolgende oproep naar de scrollRecToVisible was overbodig en was de oorzaak van de vreemde bijwerking.

Dus hier zijn de stappen om je naar behoren te scrollen UITextField in een UIScrollView op zijn plaats wanneer het toetsenbord verschijnt.

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:self.view.window];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:self.view.window];
    keyboardIsShown = NO;
    //make contentSize bigger than your scrollSize (you will need to figure out for your own use case)
    CGSize scrollContentSize = CGSizeMake(320, 345);
    self.scrollView.contentSize = scrollContentSize;
}

- (void)keyboardWillHide:(NSNotification *)n
{
    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;


    // resize the scrollview
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height += (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];

    keyboardIsShown = NO;
}

- (void)keyboardWillShow:(NSNotification *)n
{
    // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown.  This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`.  If we were to resize the `UIScrollView` again, it would be disastrous.  NOTE: The keyboard notification will fire even when the keyboard is already shown.
    if (keyboardIsShown) {
        return;
    }

    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    // resize the noteView
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];
    keyboardIsShown = YES;
}
  1. Meld u aan voor de toetsenbordmeldingen op viewDidLoad
  2. Maak de registratie voor de toetsenbordofficitaties ongedaan viewDidUnload
  3. Zorg ervoor dat de contentSize is ingesteld en groter dan jouw UIScrollView op viewDidLoad
  4. Krimpen de UIScrollView wanneer het toetsenbord aanwezig is
  5. Terugdraaien de UIScrollView wanneer het toetsenbord weggaat.
  6. Gebruik een ivar om te detecteren of het toetsenbord al op het scherm wordt weergegeven, omdat de toetsenbordmeldingen telkens worden verzonden als een UITextField is getabd, zelfs als het toetsenbord al aanwezig is om te vermijden krimpen de UIScrollView wanneer het al is gekrompen

Een ding om op te merken is dat de UIKeyboardWillShowNotification wordt geactiveerd, zelfs wanneer het toetsenbord al op het scherm staat wanneer u op een ander tabblad typt UITextField. Ik heb dit gedaan met behulp van een ivar om te voorkomen dat de grootte van de UIScrollView wanneer het toetsenbord al op het scherm staat. Onbedoeld de grootte van het UIScrollView wanneer het toetsenbord al is, zou er rampzalig zijn!

Ik hoop dat deze code sommigen van jullie veel hoofdpijn bespaart.


437



Het is eigenlijk het beste om de implementatie van Apple te gebruiken, zoals voorzien in de docs. De code die ze verstrekken is echter defect. Vervang het gedeelte gevonden in keyboardWasShown: net onder de opmerkingen bij het volgende:

NSDictionary* info = [aNotification userInfo];
CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];
CGSize kbSize =keyPadFrame.size;
CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];
CGRect aRect = self.view.bounds;
aRect.size.height -= (kbSize.height);

CGPoint origin =  activeRect.origin;
origin.y -= backScrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin)) {
    CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));
    [backScrollView setContentOffset:scrollPoint animated:YES];
}

De problemen met de code van Apple zijn deze: (1) Ze berekenen altijd of het punt binnen het kader van het beeld valt, maar het is a ScrollView, dus het kan al zijn verschoven en u moet rekening houden met die offset:

origin.y -= scrollView.contentOffset.y

(2) Ze verplaatsen de contentOffset naar de hoogte van het toetsenbord, maar we willen het tegenovergestelde (we willen de contentOffset door de hoogte die zichtbaar is op het scherm, niet wat niet):

activeField.frame.origin.y-(aRect.size.height)

260



In textFieldDidBeginEditting en in textFieldDidEndEditing bel de functie [self animateTextField:textField up:YES] zoals zo:

-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self animateTextField:textField up:YES]; 
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField:textField up:NO];
}

-(void)animateTextField:(UITextField*)textField up:(BOOL)up
{
    const int movementDistance = -130; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? movementDistance : -movementDistance); 

    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

Ik hoop dat deze code je zal helpen.

In Swift 2

func animateTextField(textField: UITextField, up: Bool) 
{
     let movementDistance:CGFloat = -130
     let movementDuration: Double = 0.3

     var movement:CGFloat = 0
     if up 
     {
         movement = movementDistance
     }
     else 
     {
         movement = -movementDistance
     }
     UIView.beginAnimations("animateTextField", context: nil)
     UIView.setAnimationBeginsFromCurrentState(true)
     UIView.setAnimationDuration(movementDuration)
     self.view.frame = CGRectOffset(self.view.frame, 0, movement)
     UIView.commitAnimations()
}


func textFieldDidBeginEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:true)
}

func textFieldDidEndEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:false)
}

SWIFT 3

 func animateTextField(textField: UITextField, up: Bool)
    {
        let movementDistance:CGFloat = -130
        let movementDuration: Double = 0.3

        var movement:CGFloat = 0
        if up
        {
            movement = movementDistance
        }
        else
        {
            movement = -movementDistance
        }
        UIView.beginAnimations("animateTextField", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration)
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }


    func textFieldDidBeginEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:true)
    }

    func textFieldDidEndEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:false)
    }

238



Alleen met TextFields:

1a) Gebruik Interface Builder: Selecteer All TextFields => Bewerken => Insluiten => ScrollView

1b) TextFields handmatig insluiten in UIScrollView met de naam scrollView

2) Instellen UITextFieldDelegate

3) Stel elk in textField.delegate = self; (of maak verbindingen in Interface Builder)

4) Kopiëren plakken:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [scrollView setContentOffset:CGPointZero animated:YES];
}

133



Voor Universele oplossing, Hier was mijn aanpak voor implementatie IQKeyboardManager.

enter image description here

Stap 1:- Ik heb globale meldingen van UITextField, UITextView, en UIKeyboard in een singleton-klas. ik noem het IQKeyboardManager.

Stap 2:- Als gevonden UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotification of UITextViewTextDidBeginEditingNotification meldingen, probeer ik te krijgen topMostViewController bijvoorbeeld van de UIWindow.rootViewController hiërarchie. Om goed te ontdekken UITextField/UITextView ben ermee bezig, topMostViewController.viewhet frame moet worden aangepast.

Stap 3:- Ik heb de verwachte verplaatsingsafstand van berekend topMostViewController.view met betrekking tot de eerste gereageerd UITextField/UITextView.

Stap 4:- ik bewoog topMostViewController.view.frame op / neer volgens de verwachte verplaatsingsafstand.

Stap 5: - Als gevonden UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotification of UITextViewTextDidEndEditingNotification melding, ik probeer het opnieuw te krijgen topMostViewController bijvoorbeeld van de UIWindow.rootViewController hiërarchie.

Stap 6: - Ik heb de verstoorde afstand berekend van topMostViewController.view die moet worden hersteld naar zijn oorspronkelijke positie.

Step7: - Ik heb hersteld topMostViewController.view.frame naar beneden volgens de verstoorde afstand.

Stap 8: - Ik heb singleton geïnstantieerd IQKeyboardManager klasse instantie op app load, dus elke UITextField/UITextView in de app wordt automatisch aangepast aan de verwachte verplaatsingsafstand.

Dat is alles IQKeyboardManager voor je doen met GEEN LIJN VAN CODE werkelijk!! hoeft alleen het gerelateerde bronbestand naar project te slepen en neer te zetten. IQKeyboardManager ook ondersteuning Apparaatoriëntatie, Automatisch UIToolbar Management, KeybkeyboardDistanceFromTextField en veel meer dan je denkt.


106



Ik heb een universele, drop-in samengesteld UIScrollView, UITableView en zelfs UICollectionView subklasse die ervoor zorgt dat alle tekstvelden binnen het toetsenbord worden verplaatst.

Wanneer het toetsenbord op het punt staat te verschijnen, zal de subklasse de subweergave vinden die op het punt staat te worden bewerkt, en de frame en content offset aanpassen om ervoor te zorgen dat de weergave zichtbaar is, met een animatie die overeenkomt met het toetsenbord pop-up. Wanneer het toetsenbord verdwijnt, wordt de vorige grootte hersteld.

Het zou met vrijwel elke setup moeten werken, ofwel een UITableViewop basis van een interface, of een interface die handmatig is geplaatst.

Dit is het volgende: oplossing voor het verplaatsen van tekstvelden uit de buurt van het toetsenbord


99



Voor Snel Programmeurs:

Dit zal alles voor je doen, zet deze gewoon in je view controller klasse en implementeer de UITextFieldDelegate naar je view controller en stel de gedelegeerde van de textField in self 

textField.delegate = self // Setting delegate of your UITextField to self

Implementeer de callback-methoden van de gedelegeerde:

func textFieldDidBeginEditing(textField: UITextField) {
    animateViewMoving(true, moveValue: 100)
}

func textFieldDidEndEditing(textField: UITextField) {
    animateViewMoving(false, moveValue: 100)
}

// Lifting the view up
func animateViewMoving (up:Bool, moveValue :CGFloat){
    let movementDuration:NSTimeInterval = 0.3
    let movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

84



Er zijn al veel antwoorden, maar nog steeds bevat geen enkele van de bovenstaande oplossingen al het mooie positioneringsmateriaal dat nodig is voor een "perfecte" bugvrije, achterwaarts compatibele en flikkervrije animatie. (bug bij het animeren van frame / grenzen en contentOffset samen, verschillende interfaceoriëntaties, iPadgesplitst toetsenbord, ...)
Laat me mijn oplossing delen:
(ervan uitgaande dat je hebt ingesteld UIKeyboardWill(Show|Hide)Notification)

// Called when UIKeyboardWillShowNotification is sent
- (void)keyboardWillShow:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = [notification userInfo];

    CGRect keyboardFrameInWindow;
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrameInWindow];

    // the keyboard frame is specified in window-level coordinates. this calculates the frame as if it were a subview of our view, making it a sibling of the scroll view
    CGRect keyboardFrameInView = [self.view convertRect:keyboardFrameInWindow fromView:nil];

    CGRect scrollViewKeyboardIntersection = CGRectIntersection(_scrollView.frame, keyboardFrameInView);
    UIEdgeInsets newContentInsets = UIEdgeInsetsMake(0, 0, scrollViewKeyboardIntersection.size.height, 0);

    // this is an old animation method, but the only one that retains compaitiblity between parameters (duration, curve) and the values contained in the userInfo-Dictionary.
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    _scrollView.contentInset = newContentInsets;
    _scrollView.scrollIndicatorInsets = newContentInsets;

    /*
     * Depending on visual layout, _focusedControl should either be the input field (UITextField,..) or another element
     * that should be visible, e.g. a purchase button below an amount text field
     * it makes sense to set _focusedControl in delegates like -textFieldShouldBeginEditing: if you have multiple input fields
     */
    if (_focusedControl) {
        CGRect controlFrameInScrollView = [_scrollView convertRect:_focusedControl.bounds fromView:_focusedControl]; // if the control is a deep in the hierarchy below the scroll view, this will calculate the frame as if it were a direct subview
        controlFrameInScrollView = CGRectInset(controlFrameInScrollView, 0, -10); // replace 10 with any nice visual offset between control and keyboard or control and top of the scroll view.

        CGFloat controlVisualOffsetToTopOfScrollview = controlFrameInScrollView.origin.y - _scrollView.contentOffset.y;
        CGFloat controlVisualBottom = controlVisualOffsetToTopOfScrollview + controlFrameInScrollView.size.height;

        // this is the visible part of the scroll view that is not hidden by the keyboard
        CGFloat scrollViewVisibleHeight = _scrollView.frame.size.height - scrollViewKeyboardIntersection.size.height;

        if (controlVisualBottom > scrollViewVisibleHeight) { // check if the keyboard will hide the control in question
            // scroll up until the control is in place
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y += (controlVisualBottom - scrollViewVisibleHeight);

            // make sure we don't set an impossible offset caused by the "nice visual offset"
            // if a control is at the bottom of the scroll view, it will end up just above the keyboard to eliminate scrolling inconsistencies
            newContentOffset.y = MIN(newContentOffset.y, _scrollView.contentSize.height - scrollViewVisibleHeight);

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        } else if (controlFrameInScrollView.origin.y < _scrollView.contentOffset.y) {
            // if the control is not fully visible, make it so (useful if the user taps on a partially visible input field
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y = controlFrameInScrollView.origin.y;

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        }
    }

    [UIView commitAnimations];
}


// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillHide:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = notification.userInfo;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    // undo all that keyboardWillShow-magic
    // the scroll view will adjust its contentOffset apropriately
    _scrollView.contentInset = UIEdgeInsetsZero;
    _scrollView.scrollIndicatorInsets = UIEdgeInsetsZero;

    [UIView commitAnimations];
}

61



Shiun zei: "Ik geloof dat de UIScrollView impliciet impliciet het momenteel bewerkte UITextField impliciet in het zichtbare venster brengt". Dit lijkt waar te zijn voor iOS 3.1.3, maar niet voor 3.2, 4.0 of 4.1. Ik moest een expliciete scrollRectToVisible toevoegen om het UITextField zichtbaar te maken op iOS> = 3.2.


60