6

私のアプリでは、UITextFieldsはキーボードの上部がある場所の下に配置されているため、編集中にテキストフィールドがキーボード上に表示されるように、ビューを上に移動する必要があります。これを行うために、UITextFieldDelegateメソッドtextFieldDidBeginEditing:を使用します。次に、メソッドtextFieldDidEndEditing:で、ビューを下に移動します。

テキストフィールドを切り替えようとすると、問題が発生します。私がそうすると、デリゲートはメソッドtextFieldDidEndEditing:を呼び出し、すぐに他のテキストフィールドに対してtextFieldDidBeginEditing:を呼び出します。これにより、ビューが下に移動し、すぐに上に移動するため、画面が揺れるように見えます。この効果の回避策はありますか?

4

4 に答える 4

2

私はまったく同じ問題を抱えていました、そしてこれは私がたどり着いた解決策です。

textFieldのキーボードが辞任されたときに処理するための別のメソッドを設定し、そこにself.view.centerの再配置を配置します。このようにして、textFieldDidEndEditingメソッドを確実に分離できます。

これは私が自分自身を適切に説明しなかった場合の例です。ユーザーがtextFieldをタップすると、ナビゲーションバーにDONEボタンが配置されます(数字キーパッドであるため)。ただし、このメソッドは通常のキーボードのDONEボタンにリンクできます。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    UIBarButtonItem *hideKeyboardButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(resignResponder:)];
    [self.navigationItem setRightBarButtonItem:hideKeyboardButton animated:YES];
}

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

//Nothing needs to go here anymore

}

- (void)resignResponder:(id)sender {
    [textField resignFirstResponder];
    //Use core animation instead of the simple action below in order to reduce 'snapback'
    self.view.center = CGRectMake(0, 0, 320, 480);
}
于 2012-07-03T21:14:44.727 に答える
0

テキストフィールドを移動する最良の方法は、通知に登録することだと思います

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

KeyboardWillShow:&keyboardWillHide:のテキストフィールドフレームの変更を行います。

于 2012-07-06T09:34:58.620 に答える
0

自分がどのテキストフィールドにいるかを確認するだけです(たとえば、tagsを付けます)。次に、この情報に従って、ビューを移動するか、移動しないでください。

于 2012-07-02T21:33:22.173 に答える
0

この問題を解決するために別のアプローチを使用しました。ある編集コントロールから別の編集コントロールに切り替えると(field1-> field2)、次のメッセージが表示されます。

  • textFieldShouldBeginEditing(field2)
  • textFieldShouldEndEditing(field1)
  • textFieldDidEndEditing(field1)
  • textFieldDidBeginEditing(field2)

私がしていることは、カウンター変数(x)を使用することです。

  • textFieldShouldBeginEditingにx+=1を追加します
  • textFieldShouldEndEditingにx-=1を追加します

それで:

  • textFieldDidEndEditingで、x <0の場合、コントロールを元の位置に拡大します
  • textFieldDidBeginEditingで、x>0の場合はコントロールをロールアップします
于 2014-10-27T16:50:09.213 に答える