39

サブビューが最初のレスポンダーになった場合に自動的にスクロールする必要があることを示唆する投稿を見たことがあります。ただし、これを機能させる方法がわかりません。 UIScrollViewsUITextField

私が持っているのは で、UIViewControllerそのUIScrollViewUIScrollViewには複数のテキストフィールドがあります。

必要に応じてこれを手動で行う方法を知っています。ただし、私が読んでいることから、自動スクロールすることは可能であるようです。助けてください。

4

12 に答える 12

44

この例がお役に立てば幸いです。このコードで任意のポイントにスクロールできます。

scrollView.contentOffset = CGPointMake(0,0);

したがって、テキストフィールドがある場合は、ビューにx、y位置が必要なので、使用できます

CGPoint point = textfield.frame.origin ;
scrollView.contentOffset = point 

これでうまくいくはずです。

ただし、このコードをいつ呼び出すかわからない場合は、UITextFieldDelegateメソッドを学習する必要があります。

このメソッドをコードに実装します

- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}

デリゲート メソッドの使用方法を理解していただければ幸いです。

于 2012-10-24T21:10:17.133 に答える
8

手動で行う必要はありません。これはデフォルトの動作です。動作が見られない理由については、2 つの可能性があります。

  1. 最も可能性の高い理由は、キーボードがあなたを覆っていることUITextFieldです。解決策は以下を参照してください
  2. もう 1 つの可能性は、自動スクロールしたいと のUIScrollView間のビュー階層のどこかに別のものがあることです。これは可能性は低いですが、それでも問題を引き起こす可能性があります。UITextFieldUIScrollView

#1 については、キーボードの下にあるコンテンツを移動するための Apple の推奨事項に似たものを実装したいと考えています。Apple が提供するコードは回転を考慮していないことに注意してください。コードの改善については、ウィンドウを使用してキーボードのフレームを適切に変換するメソッドのこのブログ投稿の実装を確認してください。keyboardDidShow

于 2015-04-01T17:44:29.467 に答える
5
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGRect rect = [textField bounds];
    rect = [textField convertRect:rect toView:self.scrollView];
    rect.origin.x = 0 ;
    rect.origin.y -= 60 ;
    rect.size.height = 400;

    [self.scrollView scrollRectToVisible:rect animated:YES];
}
于 2015-06-09T11:56:17.747 に答える
3

この関数は、UITextField の autoScroll に使用できます。

の上UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {

[self autoScrolTextField:textField onScrollView:self.scrollView];
}




- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView { 
 float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.origin.y + (textField.frame.origin.y + textField.frame.size.height);

if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
    slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
    CGPoint point = CGPointMake(0.0f, slidePoint);
    scrollView.contentOffset = point;
}

編集:

私は今IQKeyboardManagerを使用 しています これの開発者への称賛、あなたはこれを試す必要があります。

于 2014-07-28T06:00:02.727 に答える
1

複数のテキストフィールド(、、など)があり、 textfield2がファーストレスポンダーになったときにy軸に沿ってスクロールビューTextfield1をスクロールしたい場合:Textfield2Textfield3

if([Textfield2 isFirstResponder])
{
    scrollView.contentOffset = CGPointMake(0,yourY);
} 
于 2012-10-24T23:13:20.243 に答える
0

上記のポイント 2 で Michael McGuire が述べたように、スクロール ビューにテキスト フィールドとスクロール ビューの間に別のスクロール ビューが含まれている場合、システムのデフォルトの動作は正しく動作しません。テキストフィールドの隣にスクロールビューがある場合にも誤動作が発生することがわかりました(両方ともスクロールビューに埋め込まれており、テキストフィールドの編集を開始したいときにテキストフィールドを表示するように調整する必要があります。これはiOS 12.1 で。

しかし、私の解決策は上記とは異なります。プロパティを追加してメソッドをオーバーライドできるようにサブクラス化されている最上位のスクロール ビューでは、オーバーライドしますscrollRectToVisible:animated:。テキストフィールドのフレームである、渡された[super scrollRectToVisible:animated:]ものを調整するように指示するプロパティセットがない限り、単にそれを呼び出します。rectプロパティが非 nil の場合、それはUITextField問題の への参照でありrect、スクロール ビューがシステムの想定よりも先に進むように調整されます。したがって、これをUIScrollViewのサブクラス化されたヘッダー ファイルに入れます。

@property (nullable) UITextField *textFieldToBringIntoView;

(実装に適切@synthesize textFieldToBringIntoView;です。次に、このオーバーライドメソッドを実装に追加しました:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)how
{
    if (textFieldToBringIntoView) {
       // Do whatever mucking with `rect`'s origin needed to make it visible
       // based on context or its spatial relationship with the other
       // view that the system is getting confused by.

       textFieldToBringIntoView = nil;        // Go back to normal
       }
    [super scrollRectToVisible:rect animated:how];
}

UITextField編集を開始しようとしているときの for のデリゲート メソッドで、問題textFieldToBringIntoViewの に設定するだけです。textField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Ensure it scrolls into view so that keyboard doesn't obscure it
    // The system is about to call |scrollRectIntoView:| for the scrolling
    // superview, but the system doesn't get things right in certain cases.

    UIScrollView *parent = (UIScrollView *)textField.superview;
    // (or figure out the parent UIScrollView some other way)

    // Tell the override to do something special just once
    // based on this text field's position in its parent's scroll view.
    parent.textFieldToBringIntoView = textField;
    // The override function will set this back to nil

    return(YES);
}

うまくいくようです。そして、Apple がバグを修正したとしても、まだ機能するようです (指を交差させてください)。

于 2019-01-09T06:39:25.937 に答える