2013-09-28 16 views
9

Gdy klawiatura była ukryta, widok przewijania powinien powrócić do contentInset strony początkowej, ale nie działa w systemie iOS7. Ustawianie zawartości scrollviewInset, gdy wyświetlana jest klawiatura działa, ale gdy klawiatura była ukryta, zawartość contentInset scrollview nie może ustawić się na zero. Kod:iOS7 UIScrollView zawartośćInstalacja nie działa

- (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

Czy możesz wyjaśnić, jak to nie działa (jak to działa po ukryciu klawiatury)? Zauważ, że na iOS 7, jeśli masz przezroczysty 'navigationBar', twój kontroler widoku ustawi wstawkę z góry do swoich scrollViews, jeśli nie zostanie ustawione inaczej. Tak może być w tym przypadku, ponieważ ustawiasz 'contentInset.top = 0', więc może ukryć pewną zawartość za' navigationBar' lub 'statusBar'. –

+0

Dzięki za odpowiedź. Ustawiłem szczyt na navigationBar.frame.size.height i teraz działa. –

+1

Napisz odpowiedź i daj alex-i trochę kredytu;) –

Odpowiedz

9

Spróbuj tego:

self.automaticallyAdjustsScrollViewInsets = NO;

To działa dla mnie ...

0

Tak, tylko dlatego, że jeszcze znaleźć tę odpowiedź użyteczne, o to co Zrobiłem. Wziąłem radę @ alex-i i komentarz @ yong-ho. Ale z jakiegoś powodu wysokość paska nawigacji nie była wystarczająca.

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

Tak jak powiedziałem, musiałem dodać, że 20.0f lub moja treść była nadal odcięta. Nie pewny dlaczego. Jeśli się zorientuję, zaktualizuję odpowiedź.

+0

Też doświadczyłem tego problemu, muszę dodać około 90 do contentInsets, scrollIndicatorInsets działa dobrze. Czy używasz autosizing? – streem

+0

Nigdy nie używaj takich liczb magicznych ('20,0f'). Uzyskaj bezpośrednio wysokość paska stanu. Zmieniła się na przykład wysokość paska statusu na przykład dla iPhone X lub zmiany na wcześniejszych urządzeniach podczas rozmowy telefonicznej na "40.0f" – Dermot

1

może to być związane z contentSize nie działa wyjątkiem sytuacji, gdy ustawiony w VC

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

prostu mówiąc może być rozbijając głowę przed niewłaściwym ścianie

Powiązane problemy