1

このドキュメントに従って、キーボードによってテキストフィールドがブロックされたときにUIscrollをスクロールさせる作業をしています

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW7

しかし悲しいことに...言及された変数があります、activeFieldと私はそれがどのように宣言されているか理解できません。それがどのように/どこで宣言されているか、あるいはキーボードがアクティブになっているときにスクロールするための解決策さえも役立つかもしれないと私は本当に望んでいます。

ありがとうございました

4

3 に答える 3

2

具体的な質問に答えるには、Apple のドキュメントではサイズ データに activeField しか使用されていないため、それをプライベート グローバルUIView *activeFieldとして宣言するだけで、textFields、textViews などでも同じように機能します。

しかし、彼らのコードは実際にはまったくうまく機能しません。私のコードを正しく動作させるには、コードにいくつかの変更を加える必要がありました。このコードは基本的に、以下にリストされているすべてのケースを処理するためにいくつかのマイナーな調整を加えたものです。

1) ビュー内に小さな scrollView がネストされている場合、フルスクリーンの scrollView ではなく、引き続き機能します。2) テキスト フィールドをキーボード フォーカス領域まで下に移動したい場合と、キーボードの後ろから上に移動したい場合。3) さまざまなサイズの textView および textField で動作します 4) キーボードが現在表示されている場合、新しくタップされたフィールドをフォーカス エリアに移動します 5) コンテンツが既にスクロールされていて、キーボードを呼び出している場合に動作します 6) すべてのキーボードで動作しますすべてのデバイスのサイズ (ハードコードされた定数なし)

まず、これらのプライベート変数を作成します。

UIView *_activeField;
CGFloat _keyboardHeight;
BOOL _isShowingKeyboard;

次に、このコードを切り取って ViewController に貼り付けます (たくさんあるように見えますが、それほど悪くはありません)。

#pragma mark TextFieldKeyboardScrolling

- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)adjustInputFieldsForKeyboard {
    CGFloat keyBoardTopInScrollView = self.view.frame.size.height - _keyboardHeight - self.scrollView.frame.origin.y;
    CGFloat inputFieldBottomInVisibleScrollView = _activeField.frame.origin.y - self.scrollView.contentOffset.y + 30 /* small buffer for cursor size */;
    CGPoint scrollPoint;
    if (keyBoardTopInScrollView > inputFieldBottomInVisibleScrollView) {
        scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y - (keyBoardTopInScrollView - inputFieldBottomInVisibleScrollView));
    } else {
        scrollPoint = CGPointMake(0.0, self.scrollView.contentOffset.y + (inputFieldBottomInVisibleScrollView - keyBoardTopInScrollView));
    }
    [self.scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)keyboardWasShown:(NSNotification*)aNotification {
    _isShowingKeyboard = YES;
    NSDictionary* info = [aNotification userInfo];
    _keyboardHeight = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, _keyboardHeight, 0.0);
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
    [self adjustInputFieldsForKeyboard];
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    _isShowingKeyboard = NO;
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
}

#pragma mark UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    _activeField = textField;
    if (_isShowingKeyboard) {
        [self adjustInputFieldsForKeyboard];
    }
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    _activeField = nil;
}

それだけです。[self registerForKeyboardNotifications] を呼び出すだけです。viewDidLoad メソッドで、scrollView アウトレットと textField/textView デリゲートをストーリーボードに接続すれば、準備は完了です。

于 2013-07-26T19:41:34.730 に答える
0

キーボードは、texfields の 1 つがアクティブになったとき (ファーストレスポンダーになったとき) にのみアクティブになります。そのため、UITextField デリゲート メソッドをリッスンして、いつ、どの uitextfield がファーストレスポンダーになったかを確認する必要があります。- (void)textFieldDidBeginEditing:(UITextField *)textField

テキストフィールドにタグを割り当てるか ivar にすると、どの uitextfield がアクティブになったかを理解し、そのフレームを取得することもできます。

于 2012-08-09T19:21:58.777 に答える
0

スクロール ビューを使用しないか、上記のドキュメントに従いません。

スクロールビューを使用しない方法は次のとおりです

textFieldShouldBeginEditing

CGRect frame = self.view.frame;
frame.origin.y = <some negative value>;
self.view.frame = frame

そして私の中で

textFieldShouldEndEditing

CGRect frame = self.view.frame;
frame.origin.y = <some positive value>; // absolute value of your above negative value
self.view.frame = frame

上記は私にとってはうまくいきます。これらはテキスト フィールド デリゲート メソッドであることを思い出してください。したがって、デリゲートを設定する必要があります。

于 2012-08-09T19:33:36.780 に答える