web-dev-qa-db-ja.com

iPhone-キーボードがTextFieldを非表示にする

ユーザー入力を受け取るためにUITextFieldを使用しています。ただし、テキストフィールドはペン先の中央/下部にあるため、キーボードがポップアップすると非表示になります。キーボードと一緒にスライドさせて、選択時にキーボードの上部に配置する方法はありますか?また、テンキーも使用しているので、どこかに完了ボタンを簡単に含める方法はありますか?

助けてくれてありがとう。

22
intl

キーボードが表示されたときにスクロールするには、Cocoa With Loveの このチュートリアル が好きです。

数字キーパッドを閉じるには、 キーパッドにカスタムの「完了」ボタンを配置 するか、画面の残りの部分に非表示のボタンを作成します。後者はコードで行いましたが、 このチュートリアル はInterface Builderを使用しています。

17
gerry3

この問題の簡単なアプリケーションを作成しました。テキストフィールドの位置を自動的にチェックし、キーボードがそれを非表示にした場合、必要に応じて自動的に上に移動します。


- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField:textField up:YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField:textField up:NO];
}


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    int animatedDistance;
    int moveUpValue = textField.frame.Origin.y+ textField.frame.size.height;
    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {

        animatedDistance = 216-(460-moveUpValue-5);
    }
    else
    {
        animatedDistance = 162-(320-moveUpValue-5);
    }

    if(animatedDistance>0)
    {
        const int movementDistance = animatedDistance;
        const float movementDuration = 0.3f; 
        int movement = (up ? -movementDistance : movementDistance);
        [UIView beginAnimations: nil context: nil];
        [UIView setAnimationBeginsFromCurrentState: YES];
        [UIView setAnimationDuration: movementDuration];
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);       
        [UIView commitAnimations];
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

    [textField resignFirstResponder];
    return YES;
}
26
ValayPatel

これは手動で行う必要があります。この回答をご覧ください。 ITextField:キーボードが表示されたらビューを移動

3
Ben Zotto

誰かがそれを必要とする場合、私はValayPatelのソリューションをSwiftに翻訳しました

func animatedTextField(textField: UITextField, up: Bool){
    var animatedDistance : Int = 0
    let moveUpValue : Int = Int(textField.frame.Origin.y) + Int(textField.frame.size.height)

    switch UIDevice.currentDevice().orientation {
    case .Portrait , .PortraitUpsideDown:
        animatedDistance = 216 - (460 - moveUpValue - 5)
    default:
        animatedDistance = 162 - (320 - moveUpValue - 5)
    }

    if (animatedDistance > 0 ){

        let movementDistance : Int = animatedDistance
        let movementDuration : Float = 0.3
        let movement = up ? -movementDistance : movementDistance
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(NSTimeInterval(movementDuration))
        self.view.frame = CGRectOffset(self.view.frame, 0, CGFloat(movement))
        UIView.commitAnimations()

    }

}
3

このコードを使用してください:

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:) 
                                             name:UIKeyboardDidShowNotification 
                                           object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification 
                                           object:self.view.window];
}


- (void)viewDidDisappear:(BOOL)animated {
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidShowNotification 
                                              object:nil]; 
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIKeyboardDidHideNotification 
                                              object:nil];
}

- (void)keyboardDidHide:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height += 140;
else viewFrame.size.height += 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = NO;
}

- (void)keyboardDidShow:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft)) 
    viewFrame.size.height -= 140;
else viewFrame.size.height -= 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = YES; }

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
CGRect viewFrame = scrollView.frame;
if ((interfaceOrientation == UIDeviceOrientationLandscapeRight) || (interfaceOrientation == UIDeviceOrientationLandscapeLeft)) //wants to change to landscape mode
    if (keyboardVisible == NO)//currently in portrait,check if keyboard was present
            viewFrame.size = CGSizeMake(480,250);
    else viewFrame.size = CGSizeMake(480,170);
else {//wants to change to portrait mode
    if (keyboardVisible == NO)//currently in landscape,check if keyboard was present
        viewFrame.size = CGSizeMake(320,416);
    else viewFrame.size = CGSizeMake(320,200);
}
scrollView.frame = viewFrame;

return YES;
}

ランドスケープモードでも機能しますが、iPhoneのみです。 iPadの場合、それに応じてフレーム設定を変更します。 textFieldShouldReturn:メソッドは、リターンが押されたときにキーボードを非表示にします。お役に立てれば...

3
tipycalFlow

以下のコードは私にとって完璧に機能します。

[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];
3
idea2real

このような状況は、iPhoneをひどく傷つけます。キーボードが表示されたときにフィールドが表示されるようにインターフェースを設計するか、キーボードが表示されたときにフィールドを上にシフトする必要があります。 (そしてあなたが終わったら戻ってください)

Apple連絡先や設定などのアプリを見て、これがどのように処理されているかを確認することをお勧めします。

また、iPhone HIGにはそれについて何か言いたいことがあると思います。

1
Stefan Arentz

私は同様の質問に対する無数の答えを探し続けてきました。基本的な単一画面アプリの場合、このソリューションは魅力のように機能し、実装は非常に簡単です: https://github.com/michaeltyson/TPKeyboardAvoiding

確かにもっと洗練された解決策がありますが、これは仕事を迅速に完了させます。

0
Matt Perejda

私はこれに答えるのが少し遅れていることを知っていますが、非常に簡単な解決策を見つけました。 tableViewをオブジェクトとして持つUIViewControllerではなく、UITableViewコントローラーを使用する場合、この問題は発生しません。

テーブルの下部にあるテキストフィールドをクリックすると、キーボードがポップアップし、編集中のテキストフィールドが表示されるまで、テーブルビューが自動的に上にスクロールします。

ただし、キーボードの戻るボタンを使用すると、自動スクロールは機能しません。このシナリオでは、テーブルを手動で上にスクロールして、テキストフィールドを表示します。

これが役に立てば幸い

0
Dinesh reddy K
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField:textField up:YES];
}

このコードをビューのcontroller.mファイルで使用してください。テキストフィールドをクリックするとこのコードが使用され、キーボードが表示されます。ビューをクリックすると、キーボードが非表示になります。これが役立つことを願っています...

0
Roby

UITableViewを編集モードに設定するのは簡単です!

- (void)viewDidLoad {

    [super viewDidLoad];

    [self.tableView setEditing:YES];
}

セルの左側にある削除バブルを非表示にする場合は、UITableViewDelegateメソッドを実装します。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

    return NO;
}
0
Adobels
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"%f",textField.frame.Origin.y);

    CGPoint scrollPoint = CGPointMake(0, textField.frame.Origin);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField 
{
    [scrollView setContentOffset:CGPointZero animated:YES];
}
0
Naresh Jain