web-dev-qa-db-ja.com

UIScrollViewでキーボードを閉じる

さて、UITextFieldsの中にUITextViewsUIScrollViewがいくつかあり、scrollviewに触れるたびにキーボードが消えるように設定したいまたはスクロールします(もちろん、テキストフィールド/ビュー内をタッチダウンする場合を除く)。

これを行う現在の試みは、UIScrollViewをサブクラスに置き換え、touchesBeganメソッド内でremoveKeyboard関数(メインビューコントローラー内で定義)を呼び出すように設定することです。ただし、これは通常のタッチでキーボードを削除するだけで、ビューが単純にスクロールされるときは削除されません。 UIScrollView内のキーボードを削除する最良の方法は何ですか?

よろしくお願いします。

59
Nicholas1024

IOS 7.0以降でこれを実現する最もクリーンな方法を次に示します。

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

または

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

迅速:

scrollView.keyboardDismissMode = .onDrag

または

scrollView.keyboardDismissMode = .interactive
133
Pei

少し遅れましたが、誰かがこの問題の答えを探しているなら、これは私がそれを解決しようとした方法です:

1)すべてのフィールドでresignFirstResponderを使用してキーボードを閉じるために、ターゲットコールバックメソッドでタップジェスチャレコグナイザーを作成します。

2)タップジェスチャをスクロールビューに追加します。

以下に例を示します。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];

// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;    

[pageScrollView addGestureRecognizer:tapGesture];

[tapGesture release];

...

// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
    [myTextFieldInScrollView resignFirstResponder];
}
51
Zhang

本質は同じですが、私はより少ないコードを好みます。

属性インスペクターでscrollViewをスクロールするとキーボードが非表示になるように設定します。

make keyboard disappear when scrollView is scrolled

次に、scrollViewをタップするとキーボードが消えます。

  1. Tap Gesture RecognizerをscrollViewにドラッグします
  2. Ctrl-Drag
  3. Make an action
  4. アクションの1行のみ-scrollView.endEditing(true)。 Objective-Cを使用している場合、[self.scrollView endEditing: YES];
34
fujianjin6471

In Swift

少し遅れましたが、誰かがこの問題の答えを探しているなら、これは私がそれを解決しようとした方法です:

1)すべてのフィールドでresignFirstResponderを使用してキーボードを閉じるために、ターゲットコールバックメソッドでタップジェスチャレコグナイザーを作成します。

2)タップジェスチャをスクロールビューに追加します。

以下に例を示します。

import UIKit

class ViewController: UIViewController {

    @IBOutlet var t1: UITextField!
    @IBOutlet var t2: UITextField!
    @IBOutlet var t3: UITextField!
    @IBOutlet var t4: UITextField!

    @IBOutlet var srcScrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")

        // prevents the scroll view from swallowing up the touch event of child buttons
        tapGesture.cancelsTouchesInView = false

        srcScrollView.addGestureRecognizer(tapGesture)
    }

    func hideKeyboard() {
        t1.resignFirstResponder()
        t2.resignFirstResponder()
        t3.resignFirstResponder()
        t4.resignFirstResponder()
    }
}
10
King-Wizard

keyboardDismissMode UIScrollViewのプロパティを見てください。

// will hide keyboard when your text field is about to go beyond the keyboard.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

// will hide keyboard instantly once the scroll view started scrolling by user.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissOnDrag;

// If you need to hide keyboard on tap of scroll view,consider adding a tap gesture or sub class and override touchesbegan: method.

迅速なバージョン

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
7
Naresh Reddy M

これを試して

[self.selectedViewController.view endEditing:YES];

3
Saad Ur Rehman

少し遅いが、誰かがSwiftでこの問題の答えを探している場合:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    view.endEditing(true)
}
3
Jorge Casariego

どこでもスクロールビュー/ビューに触れたときにキーボードを隠すための拡張クラスを作成します

extension UIViewController {
func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
}

@objc func dismissKeyboard() {
    view.endEditing(true)
}

}

そして、次のようにviewDidLoadでこのメソッドを呼び出します

 override func viewDidLoad() {
    super.viewDidLoad()

    self.hideKeyboardWhenTappedAround()

}
3
chandra1234

ジェスチャをUIScrollViewのサブクラスに追加したとき、サブビューをクリックし、ビューをスクロールし、キーボードを使用できるなど、ビューツリー内のさまざまなジェスチャが互いに干渉するという問題がありました。すべての場合に却下します。 UIScrollViewのスーパークラスまたはUIViewControllerからセットアップできるこのソリューションを思い付きました。

DismissKeyboardTapGestureクラスはARCを使用し、ビューの下の任意のテキストフィールドで機能し、ボタンなどのサブビューからのクリックを引き継ぎません。 iOS7のスクロール効果を利用して、キーボードを閉じます。

UISScrollViewスーパークラスからのセットアップ:

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];

またはUIViewControllerから:

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];

クラスは次のとおりです。

@interface DismissKeyboardTapGesture : NSObject <UIGestureRecognizerDelegate>

@end

@implementation DismissKeyboardTapGesture

- (id)initWithView:(UIView *)view
{
    self = [super init];
    if (self) {
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
        singleTap.cancelsTouchesInView = NO;
        singleTap.delegate = self;
        [view addGestureRecognizer:singleTap];

        if ([view respondsToSelector:@selector(setKeyboardDismissMode:)]) {
            // Bonus effect to dismiss keyboard by scrolling
            ((UIScrollView *)view).keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
        }
    }
    return self;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // Don't stop any existing gestures in our view from working
    if (otherGestureRecognizer.view == gestureRecognizer.view) {
        return YES;
    }
    return NO;
}

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer
{
    // Close keyboard for any text edit views that are children of the main view
    [gestureRecognizer.view endEditing:YES];
}

@end
2
Skotch
    extension UIView{
    //Set tag via storyboard 
    func keyboardDissmissInteractiveMode(_ tag:Int){
        if let scrollView = self.viewWithTag(tag) as? UIScrollView{
            scrollView.keyboardDismissMode = .interactive
        }
        if let tableview = self.viewWithTag(tag) as? UITableView{
            tableview.keyboardDismissMode = .interactive
        }
    }

    func keyboardDissmissOnDragMode(_ tag:Int){
        if let scrollView = self.viewWithTag(tag) as? UIScrollView{
            scrollView.keyboardDismissMode = .onDrag
        }
        if let tableview = self.viewWithTag(tag) as? UITableView{
            tableview.keyboardDismissMode = .onDrag
        }
    }


    func keyboardDissmissInteractiveMode(_ view:UIView){
        if let scrollView = view as? UIScrollView{
            scrollView.keyboardDismissMode = .interactive
        }
        if let tableview = view as? UITableView{
            tableview.keyboardDismissMode = .interactive
        }
    }

    func keyboardDissmissOnDragMode(_ view:UIView){
        if let scrollView = view as? UIScrollView{
            scrollView.keyboardDismissMode = .onDrag
        }
        if let tableview = view as? UITableView{
            tableview.keyboardDismissMode = .onDrag
        }
    }
}
0
jethava yogesh
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
0
vignesh.P

このスクロールビューデリゲートメソッドを試してください-

iBのデリゲートをリンクしてビューをスクロールし、このコードをコピーします(必要に応じて変更します)。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{         
//sample code    
    [challengeABallotComponent.voterNameTextField resignFirstResponder];
    [challengeABallotComponent.ballotNumberTextField resignFirstResponder];
    [locationInformation.pollingLocation resignFirstResponder];
}

これは動作するはずです。あなたも他のデリゲートメソッドを試すことができます

   -(void)scrollViewDidScroll: (UIScrollView *)scrollView 
{
//do your stuff
}
0
user1140780