2

たぶんこれは繰り返しの質問ですが、私はこの問題といくつかのiOSの概念で立ち往生しました。静的テーブルビュー3つのセクション、および各セクションにいくつかのを持つViewControllerがあります。行の中にUITextFieldsがあります。私がやろうとしているのは、キーボードが画面下部のUIテキストフィールドを非表示にしないようにすることです。キーボードの管理からアップルのソリューションを試したところですが、静的なテーブルビューにアタッチされたスクロールビューの背後にある概念がわからないため、プロジェクトにアイデアを実装できませんでした。あなたたちはそれを学ぶためにどこかをお勧めしますか?私がやろうとしていることを説明できなかったらごめんなさい。私は少し迷っています。

どんな助けでもありがたいです。

マルコス、どうもありがとう。

4

2 に答える 2

2

私は似たようなことをしなければなりませんでした、これが私のコードです、うまくいけばそれがあなたを助けるでしょう。

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    CGRect aRect = self.bounds;
    aRect.size.height -= kbSize.height;
    CGRect activeRect = [activeTextField convertRect:activeTextField.frame toView:self];

    if (!CGRectContainsPoint(aRect, activeRect.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeRect.origin.y-kbSize.height+10);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

また、ビューをロードするときは、次のように通知オブザーバーを設定してください。

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

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

activeTextFieldをUITextFieldとして定義し、移動したいものがすべてscrollViewに含まれていることを確認してください(この場合、viewControllerをscrollViewに変更できます)。また、scrollViewのcontentSizeが少なくともself.bounds.sizeであることを確認してください。

お役に立てれば。

于 2012-12-12T17:04:30.470 に答える
0

私は自分のアプリケーションでこれを行う必要がありました-スターケンボルフの答えは私に80%をもたらしましたが、TableViewsで動作するように追加したいくつかの追加の改良がありました。

主なビットは次のとおりです。

  • TableViewにはすでにインセットがあるため、それらを加算または減算する必要があります。
  • また、編集しているセルが見やすい場所に表示されるようにスクロールしたいと思います。

2番目の部分では、少し間接参照が必要です。テキストフィールドはカスタムセルに属しているため、UITableViewControllerにメッセージを送信してBeginEditingメッセージに応答する必要があります。

これがすべてがどのように組み合わされるかです。UITableViewControllerの場合:

@property (nonatomic, strong) NSIndexPath *editCellIndexPath;
@property (nonatomic) bool keyboardShowing;

//....

- (void)setEditRow:(UITableViewCell *)cell
{
    self.editCellIndexPath = [self.tableView indexPathForCell:cell];
    if (self.keyboardShowing)
    {
        [self.tableView scrollToRowAtIndexPath:self.editCellIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:true];
    }
}

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

    UIEdgeInsets edgeInsets = [self.tableView contentInset];
    edgeInsets.bottom += kbSize.height;
    UIEdgeInsets scrollInsets = [self.tableView scrollIndicatorInsets];
    scrollInsets.bottom += kbSize.height;

    self.keyboardShowing = true;

    [UIView animateWithDuration:duration animations:^{
        [self.tableView setContentInset:edgeInsets];
        [self.tableView setScrollIndicatorInsets:scrollInsets];
    }];
}

- (void)keyboardWillHide:(NSNotification *)sender
{
    CGSize kbSize = [[[sender userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    UIEdgeInsets edgeInsets = [self.tableView contentInset];
    edgeInsets.bottom -= kbSize.height;
    UIEdgeInsets scrollInsets = [self.tableView scrollIndicatorInsets];
    scrollInsets.bottom -= kbSize.height;

    self.keyboardShowing = false;

    [UIView animateWithDuration:duration animations:^{
        [self.tableView setContentInset:edgeInsets];
        [self.tableView setScrollIndicatorInsets:scrollInsets];
    }];
}

次に、各カスタムUITableViewCellsにowningControllerの弱いプロパティがあり、セルがテキスト編集されていることをコントローラーに通知します。1つの行でTextViewを使用し、別の行でTextFieldsを使用しているため、次のメソッドを使用します。

- (void)textViewDidBeginEditing:(UITextView *)textView
{
    MyCustomTableController *itemControl = (MyCustomTableController *)self.owningController;
    [itemControl setEditRow:self];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    MyCustomTableController *itemControl = (MyCustomTableController *)self.owningController;
    [itemControl setEditRow:self];
}

これまでのところ、これは非常にうまく機能しています。

于 2014-09-01T18:34:06.143 に答える