1

以下に示すように、すべてのサブビューがあるという点で、ビューにスクロールビューがあります

UIView

  Scroll View

          1.ImageView
          2.Table view
          3.Text View

ここに画像の説明を入力

√√ キーボードの表示/非表示時にスクロール ビューを移動するには、次のように textview デリゲート メソッドにロジックを実装しました √√

- (void)textViewDidBeginEditing:(UITextView *)textView;
{
      //To move the view down 
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDelegate:self];
      [UIView setAnimationDuration:0.3];
      [UIView setAnimationBeginsFromCurrentState:YES];
      scrollView.frame = CGRectMake(scrollView.frame.origin.x, (scrollView.frame.origin.y - 120), scrollView.frame.size.width, scrollView.frame.size.height);
      [UIView commitAnimations];

}


- (void)textViewDidEndEditing:(UITextView *)textView 
{   
      //To move the view down 
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDelegate:self];
      [UIView setAnimationDuration:0.3];
      [UIView setAnimationBeginsFromCurrentState:YES];
      scrollView.frame = CGRectMake(scrollView.frame.origin.x, (scrollView.frame.origin.y + 120), scrollView.frame.size.width, scrollView.frame.size.height);
      [UIView commitAnimations];
}

√√ この方法は、キーボードに対応してビューを上下に移動するのに非常に役立ちます。

しかし、ここでスクロールの問題があります。

ユーザーは、キーボードの presensec ですべてのビューをスクロールできません。ビューは次のようにある位置までスクロールします。画像/テーブルの最初の列は表示されません。

ここに画像の説明を入力

ユーザーがキーボードの存在下で最初の列/プロフィール写真を表示したい場合は不可能です。この問題を修正する方法。

4

4 に答える 4

3

最初にスクロールコンテンツを次のように設定します

scrollView.contentSize=CGSizeMake(320, 600);

そして、textViewデリゲートメソッドが次のように呼び出されたときにコンテンツをアニメーション化します

- (void)textViewDidBeginEditing:(UITextView *)textView;
{  
  [scrollView setContentOffset:CGPointMake(0, 120 ) animated:YES]; 
}

- (void)textViewDidEndEditing:(UITextView *)textView 
{
 [scrollView setContentOffset:CGPointMake(0, 0 ) animated:YES]; 
}
于 2012-10-19T12:58:56.840 に答える
1

まず第一に、textViewDidBeginEditing:メソッドを使用してキーボードを表示/非表示にしたくありません。そのためには、適切な通知に登録する必要があります。これは、 に配置できますviewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

次に、キーボードが表示されている場合は、スクロール ビュー全体を移動するのではなく、サイズを縮小してください。

- (void)keyboardWillShow:(NSNotification *)notif
{
    CGSize kbSize = [[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    double duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Shrink the scroll view's content
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;

    // Scroll the text field to be visible (use own animation with keyboard's duration)
    CGRect textFieldRect = [_activeTextField convertRect:_activeTextField.bounds toView:self.scrollView];
    [UIView animateWithDuration:duration animations:^{
        [self.scrollView scrollRectToVisible:CGRectInset(textFieldRect, 0.0, -10.0) animated:NO];
    }];
}

スクロール ビューのコンテンツも移動する必要があったため、このコードにはいくつかの追加機能がありますが、作業を開始するには機能します。そしてキーボードが隠れると…

- (void)keyboardWillHide:(NSNotification *)notif
{
    double duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Set content inset back to default with a nice little animation
    [UIView animateWithDuration:duration animations:^{
        UIEdgeInsets contentInsets = UIEdgeInsetsZero;
        self.scrollView.contentInset = contentInsets;
        self.scrollView.scrollIndicatorInsets = contentInsets;
    }];
}
于 2012-10-19T12:59:25.210 に答える
0

キーボードが表示されているときにコンテンツオフセットを適用します。そして、隠されたら元に戻します。

[scrollView setContentOffset:CGPointMake(0.0f, 120.0f) animated:YES];

キーボード呼び出しを非表示にした後。

[scrollView setContentOffset:CGPointZero animated:YES];
于 2012-10-19T12:55:27.527 に答える
0

ContentOffset を変更するだけで、コードで行っていたようにScrollView 元を変更する必要はありません。スクロールビューは常にスクロールします。ScrollViewそうすることで、upur ScrollViw の ContentSize を少なくとも 550 に設定する必要があり、適切な ContentSize が何であるかを確認するだけです。メソッドを呼び出して必要なパラメーターを適切に渡すだけのメソッドを作成しました

ContentSIzeもう 1 つのことは、 ScrollView ViewViewAppearUISCrollViewの高さを超えるものを設定します。SuperView at where you have created theor inmethod. (CurrentView)

  [contentScrollView setContentSize:CGSizeMake(320, 620)];

  And Call This Method As you click on TextField or on the Screen(In Touch Ended when you need to readjust ContentOffset)

  - (void)adjustContetOffset:(BOOL)yes withOffSet:(CGFloat)offSet
  {  

    contentOffSetY = offSet ;
     //By this you can track more suppose you have change the Orientation of Device then set Appropriate Offset.
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.4];

    if(yes){
        isScrolledUp = TRUE;
        contentScrollView.contentOffset = CGPointMake(0, contentOffSetY);
    }
    else
    {
        isScrolledUp = FALSE;
       //by this flag you can Track that OffSet of ScrollView has changed 
        contentScrollView.contentOffset = CGPointMake(0, contentOffSetY);
    }

    [UIView commitAnimations];

  }

    //this methods 'll call whenever you 'll touch the SCreen
  -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{


    if(isScrolledUp){
    [self adjustContetOffset:NO withOffSet: 0.0];
   }
    [searchTextField resignFirstResponder];
   }

お役に立てば幸いです。

于 2012-10-19T13:01:46.123 に答える