2013-11-01 12 views
11

Ho una vista sullo storyboard per mostrare il modulo di accesso dell'utente, quindi è simile a questa: vista principale-> vista di scorrimento-> vista del contenuto-> due campi di testo e pulsante di accesso al superiore e un pulsante di registro nella parte inferiore della vista. Uso l'autolayout e il pulsante in basso ha un vincolo di spazio in basso. Quando tocco il campo di testo e appare la tastiera, vorrei scorrere la vista per cambiare la dimensione in rect visibile, ma la dimensione del contenuto dovrebbe rimanere per scorrere verso il basso fino al pulsante di registrazione, ma il pulsante si sposta quando cambia la dimensione della vista di scorrimento. Come potrei fare ciò che voglio?AutoLayout iOS con scrollview e tastiera

Io uso questo codice quando viene visualizzata la tastiera:

- (void)keyboardWillShow:(NSNotification *)aNotification 
{ 
    NSDictionary *info = [aNotification userInfo]; 
    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; 
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    CGRect keyboardFrame = [kbFrame CGRectValue]; 

    CGSize s = self.scrollView.contentSize; 
    CGFloat height = keyboardFrame.size.height; 
    self.scrollViewBottomLayoutConstraint.constant = height; 

    [UIView animateWithDuration:animationDuration animations:^{ 
     [self.view layoutIfNeeded]; 
     [self.scrollView setContentSize:s]; 
    }]; 
} 

risposta

29

provare a lasciare da sola la dimensione dei contenuti, e invece regolare proprietà contentInset della vista di scorrimento. Quindi non devi pasticciare con i vincoli.

- (void)keyboardUp:(NSNotification *)notification 
{ 
    NSDictionary *info = [notification userInfo]; 
    CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; 

    UIEdgeInsets contentInset = self.scrollView.contentInset; 
    contentInset.bottom = keyboardRect.size.height; 
    self.scrollView.contentInset = contentInset; 
} 
+0

Grazie. Funziona. –

+0

Ottima risposta; funziona alla grande per me! Grazie! –

+1

bello e semplice, ma un problema è che le barre della vista di scorrimento non vengono ridimensionate alla parte visibile della vista scorrimento/tabella/raccolta. –

1

Il modo migliore che ho trovato è quello di ignorare NSLayoutConstraint in questo modo:

@implementation NHKeyboardLayoutConstraint 

- (void) dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void) awakeFromNib { 
    [super awakeFromNib]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillChangeFrame:) 
               name:UIKeyboardWillChangeFrameNotification 
               object:nil]; 
} 

- (void)keyboardWillChangeFrame:(NSNotification *)notification { 

    CGRect endKBRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

    CGFloat animationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; 
    CGRect frame = [UIApplication sharedApplication].keyWindow.bounds; 

    self.constant = frame.size.height - endKBRect.origin.y; 


    [UIView animateWithDuration:animationDuration animations:^{ 
     [[UIApplication sharedApplication].keyWindow layoutIfNeeded]; 
    }]; 
} 


@end 

poi nel vostro XI ter cambiare il tipo di classe del vincolo incriminato a questa classe.

Problemi correlati