1. ホーム
  2. ios

[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?

2022-03-17 09:12:19

質問

iOS SDKで。

私の場合は UIViewUITextField でキーボードが表示されます。できるようにする必要があります。

  1. の内容をスクロールできるようにする。 UIScrollView キーボードが表示されたら、他のテキストフィールドを見ることができます。

  2. 自動でquot;ジャンプ"(上にスクロールすることで)または短縮する

が必要なのは分かっているのですが UIScrollView . のクラスを変更してみました。 UIView に変更します。 UIScrollView が、テキストボックスを上下にスクロールできないままです。

の両方が必要なのでしょうか? UIViewUIScrollView ? 一方は他方の中に入るのでしょうか?

アクティブなテキストフィールドに自動的にスクロールするために必要な実装は何ですか?

コンポーネントのセットアップはできるだけInterface Builderで行うのが理想的です。必要な部分だけコードを書けばいいと思っています。

UIView (または UIScrollView )で作業しているところを、タブバー( UITabBar ) が、通常通り機能する必要があります。


キーボードが出てきたときのために、スクロールバーを追加しています。 必要ないとはいえ、ユーザーがスクロールしてテキストボックスを変更できるなど、よりよいインターフェイスを提供できると感じています。

のフレームサイズを変更するところで動作させています。 UIScrollView キーボードが上下するときに 単純に使っているのは

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x,
                                  scrollView.frame.origin.y,
    scrollView.frame.size.width,
    scrollView.frame.size.height - 215 + 50);   // Resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
    // Keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x,
                                  scrollView.frame.origin.y,
                                  scrollView.frame.size.width,
                                  scrollView.frame.size.height + 215 - 50); // Resize
}

しかし、これは私が本当に望んでいることですが、自動的に下のテキストフィールドを上に移動したり、可視領域で中央に配置することはできません。

解決方法は?

  1. が必要なだけです。 ScrollView 今あるコンテンツがiPhoneの画面に収まらない場合。(もし ScrollView をコンポーネントのスーパービューにするためだけです。 TextField キーボードが出たときにスクロールアップするようにすれば、必要ない)

  2. を防ぐための標準的な方法です。 TextField がキーボードに被らないようにするには、キーボードが表示されるたびにビューを上下に移動させる必要があります。

以下はサンプルコードです。

#define kOFFSET_FOR_KEYBOARD 80.0

-(void)keyboardWillShow {
    // Animate the current view out of the way
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)keyboardWillHide {
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if ([sender isEqual:mailTf])
    {
        //move the main view, so that the keyboard does not hide it.
        if  (self.view.frame.origin.y >= 0)
        {
            [self setViewMovedUp:YES];
        }
    }
}

//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // if you want to slide up the view

    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard 
        // 2. increase the size of the view so that the area behind the keyboard is covered up.
        rect.origin.y -= kOFFSET_FOR_KEYBOARD;
        rect.size.height += kOFFSET_FOR_KEYBOARD;
    }
    else
    {
        // revert back to the normal state.
        rect.origin.y += kOFFSET_FOR_KEYBOARD;
        rect.size.height -= kOFFSET_FOR_KEYBOARD;
    }
    self.view.frame = rect;

    [UIView commitAnimations];
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

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

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}