2013-09-28 3 views
9

キーボードが非表示になっていると、スクロールビューは元のcontentInsetに戻りますが、iOS7では機能しません。キーボードが表示されているときにscrollviewのcontentInsetを設定していますが、キーボードが非表示になっているときは、scrollviewのcontentInsetを0に設定することはできません。 コード:iOS7 UIScrollView contentInsetが機能しない

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

は、あなたが(どのようにそれを説明することができcontentSizeが

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

ちょうどあなたが間違って壁に頭を壊しかもしれないと言ったVCに設定されている場合を除き、 を動作していないに関係している可能性がありますキーボードが隠れた後に動作します)? iOS 7では、半透明の 'navigationBar'がある場合、View Controllerは、そうでなければ設定されていなければscrollviewsに一番上のインセットを設定します。これは 'contentInset.top = 0'を設定しているので、ここではそうかもしれないので、' navigationBar'または 'statusBar'の背後にあるコンテンツを隠すかもしれません。 –

+0

ご返信ありがとうございます。私はtopをnavigationBar.frame.size.heightに設定しました、そして、今働いています。 –

+1

答えを書いてalex-iにいくつかのクレジットを与えてください;) –

答えて

9

この方法を試してください。

self.automaticallyAdjustsScrollViewInsets = NO;

これはここで何がある、私はまだこの答えが有用であることが分かっという理由だけで、だから... ...私のため

0

を働いていますやった。私は@ alex-iのアドバイスと@ yong-hoのコメントを取った。しかし何らかの理由でナビゲーションバーの高さが十分ではなかった。

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

私が言ったように、私は20.0fを追加しなければならなかった、または私のコンテンツはまだ断ち切られました。理由は分かりません。私がそれを理解したら、私は答えを更新します。

+0

私もこの問題を経験しました。私はcontentInsetsに約90を加えなければなりません、scrollIndicatorInsetsは問題なく動作します。自動サイズ設定を使用していますか? – streem

+0

このようなマジックナンバー( '20.0f')は使用しないでください。ステータスバーの高さを直接取得します。たとえばiPhone Xのステータスバーの高さが変更されたり、「40.0f」への電話中の以前のデバイスの変更 – Dermot

1

それは働いていないか

関連する問題