2013-09-28 22 views
9

Quando la tastiera era nascosta, la scrollview dovrebbe tornare al suo contenuto contentInset, ma non funziona in iOS7. L'impostazione del contenuto di scrollviewInset quando è stata mostrata la tastiera funziona, ma quando la tastiera era nascosta, contentInsetset dello scrollview non può essere impostato su zero dell'inset. Il codice:iOS7 UIScrollView contentInset not working

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:Nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil]; 
} 

- (void)keyboardWasShown:(NSNotification *)notif 
{ 
    CGSize keyboardSize = [[[notif userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0); 


    UIScrollView *scrollView = (UIScrollView *)self.view; 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    CGRect rect = self.view.frame; 
    rect.size.height -= keyboardSize.height; 
    if (!CGRectContainsPoint(rect, self.wishContentField.frame.origin)) { 
     CGPoint point = CGPointMake(0, self.wishContentField.frame.origin.y - keyboardSize.height); 
     [scrollView setContentOffset:point animated:YES]; 
    } 

} 
- (void)keyboardWasHidden:(NSNotification *)notif 
{ 
    UIEdgeInsets zeroInsets = UIEdgeInsetsZero; 
    UIScrollView *scrollView = (UIScrollView *)self.view; 
    [scrollView setContentInset:zeroInsets]; 
    scrollView.scrollIndicatorInsets = zeroInsets; 
} 
+2

Può spiegare come non funziona (come agisce dopo la tastiera nasconde)? Tieni presente che su iOS 7, se disponi di una barra di navigazione traslucida, il tuo controller di visualizzazione imposterà un riquadro in alto alle tue scrollView se non diversamente specificato. Questo potrebbe essere il caso qui, dato che stai impostando 'contentInset.top = 0', quindi potrebbe nascondere alcuni contenuti dietro a' navigationBar' o 'statusBar'. –

+0

Grazie per la risposta. Ho impostato la parte superiore per la navigazione.Bar.frame.size.height e ora funziona. –

+1

Scrivi una risposta e dai un po 'di credito ad alex-i;) –

risposta

9

Prova questo:

self.automaticallyAdjustsScrollViewInsets = NO;

Questo sta lavorando per me ...

0

Così, solo perché ho ancora trovato utile questa risposta, qui è che cosa L'ho fatto. Ho preso il consiglio di @ alex-i e il commento di @ yong-ho. Ma per qualche ragione l'altezza della barra di navigazione non era abbastanza.

UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height + 20.0f, 0.0, 0.0, 0.0); 
scrollView.contentInset = contentInsets; 
scrollView.scrollIndicatorInsets = contentInsets; 

Come ho detto, ho dovuto aggiungere che 20.0f o il mio contenuto era ancora tagliato. Non so perché. Se lo capisco aggiornerò la mia risposta.

+0

Ho anche riscontrato questo problema, devo aggiungere circa 90 a contentInsets, lo scrollIndicatorInsets funziona comunque. Usi l'autosizing? – streem

+0

Non usare mai numeri magici come questo ('20.0f'). Ottieni l'altezza della barra di stato direttamente. L'altezza della barra di stato è cambiata per l'iPhone X, per esempio, o cambia su dispositivi precedenti durante una telefonata a '40.0f' – Dermot

1

potrebbe essere correlato a contentSize non funziona tranne quando è impostato in VC

- (void)viewDidLayoutSubviews 
{ 
    self.scrollView.contentSize = whatever 
} 

solo dicendo che potrebbe essere fracassare la testa contro il muro sbagliato