さて、UITextFields
の中にUITextViews
とUIScrollView
がいくつかあり、scrollview
に触れるたびにキーボードが消えるように設定したいまたはスクロールします(もちろん、テキストフィールド/ビュー内をタッチダウンする場合を除く)。
これを行う現在の試みは、UIScrollView
をサブクラスに置き換え、touchesBeganメソッド内でremoveKeyboard関数(メインビューコントローラー内で定義)を呼び出すように設定することです。ただし、これは通常のタッチでキーボードを削除するだけで、ビューが単純にスクロールされるときは削除されません。 UIScrollView
内のキーボードを削除する最良の方法は何ですか?
よろしくお願いします。
IOS 7.0以降でこれを実現する最もクリーンな方法を次に示します。
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
または
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
迅速:
scrollView.keyboardDismissMode = .onDrag
または
scrollView.keyboardDismissMode = .interactive
少し遅れましたが、誰かがこの問題の答えを探しているなら、これは私がそれを解決しようとした方法です:
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];
}
本質は同じですが、私はより少ないコードを好みます。
属性インスペクターでscrollViewをスクロールするとキーボードが非表示になるように設定します。
次に、scrollViewをタップするとキーボードが消えます。
scrollView.endEditing(true)
。 Objective-Cを使用している場合、[self.scrollView endEditing: YES];
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()
}
}
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
これを試して
[self.selectedViewController.view endEditing:YES]
;
少し遅いが、誰かがSwiftでこの問題の答えを探している場合:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
view.endEditing(true)
}
どこでもスクロールビュー/ビューに触れたときにキーボードを隠すための拡張クラスを作成します
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()
}
ジェスチャを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
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
}
}
}
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
このスクロールビューデリゲートメソッドを試してください-
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
}