2012-06-06 20 views
5

UIScrollViewには、内部に複数のダイナミックビューがあり、それぞれにテキストフィールドがあります。ボックスの1つに入力を開始すると、スクロール・ビューをスクロールして、フィールドが画面上部(キーボードの上に表示可能)になるようにします。それは素晴らしい作品です。ここではコードです:スクロールビューが最上部までスクロールするたびUIScrollViewをスクロールしていくつかのテキストフィールドの最小値を表示する

(void)didStartTyping:(id)sender { 
    [scrollView setContentOffset:CGPointMake(0, subView.frame.origin.y) animated:YES]; 
    scrollView.scrollEnabled = NO; 
} 

(void)didFinishTyping:(id)sender { 
    scrollView.scrollEnabled = YES; 
} 

しかし、私は最低の目に見えるテキストフィールドに入力を開始、それは約40ピクセルで十分(短いスクロールダウンしません。 )。困惑しているのは、スクロールビューの上から1ピクセル下にスクロールすると機能しますが、上にスクロールすると非常に異なった動作をします。

+1

シナリオの両方でscollviewのフレームを記録し、そこにあるものを確認する必要がありますか?私が考えることができるのは、ボトムオフセットを増やす必要があるということです。 – rishi

+0

それは意味をなさないでしょう。しかし、今のところ、醜い回避策は、ビューが上にスクロールされたときに下のビューのテキストフィールドを見ることができないように、サブビューのサイズを変更することでした。最適ではありませんが、今のところうまくいきます。もし私がこれに戻ってきたら、それがどうなっているかを教えてあげましょう。おかげでリシ。 – Gazzini

+1

スクロール・ビューを手動で目的の位置にスクロールできます。つまり、テキスト・フィールドにフォーカスを当てるのではなく、スクロール・ビューをドラッグして、キーボードを表示する位置にします。あなたはそれをあなたが望むところにドラッグできますか?ほとんどの場合、スクロールビューのコンテンツサイズがコンテンツを密接に囲んでいる場合、実際には最後のアイテムを上に置くことはできません。これを言う別の方法は、コンテンツのサイズの高さをコンテンツよりも大きく設定することができます。 – danh

答えて

2

これを行うには、キーボードの枠をつかんで、テキストビューにtextViewDidBeginEditing:が呼び出されたときに、スクロールビューのインセットを更新するのが最も効果的です。ここではtableviewを使っていますが、同じロジックがスクロールビューに適用されるはずです。 scrollToRowAtIndexPathを使用すると、scrollRectToVisibleを使用することになります

//setup keyboard callbacks 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
} 

//this is called from your UITextViewDelegate when textViewDidBeginEditing: is called 
- (void)updateActiveTextScroll:(UITextView*)textView 
{ 
    activeTextView = textView; 
    UIEdgeInsets inset; 
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(UIInterfaceOrientationIsLandscape(orient)) 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.width, 0.0); 
    } 
    else 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); 
    } 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 

    [myTableView scrollToRowAtIndexPath:activeNSIndexPath 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; 
} 

//dont forget to reset when the keyboard goes away 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets inset = UIEdgeInsetsZero; 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 
} 
関連する問題