これはほとんどの投稿の逆であることに気づきましたが、キーボードを上げたままにしておきたいです「キーボードダウン」ボタンが押されても。
具体的には、2つのUITextField
sを持つビューがあります。次のデリゲートメソッドを使用
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return NO;
}
ユーザーがキーボードのDone
ボタンを押したり、キーボードの右下にある厄介なキーボード下ボタンを除いて画面上の他の場所をタップしたりしても、キーボードを上げたままにすることができます。
私はこのビューをモーダルビューのように使用しているので(ビューはUINavigationControllerにプッシュされるViewControllerに関連付けられていますが)、ユーザーの観点からは常にキーボードを上げたままにしておくのが最適です。誰かがこれを達成する方法を知っているなら、私に知らせてください!ありがとう!
[〜#〜] update [〜#〜]まだ解決策はありません! Done
を押すとtextFieldShouldReturn
がトリガーされますが、Dismiss
ボタンを押すとtextFieldDidEndEditing
がトリガーされます。 textField
が編集を終了するのをブロックできないか、決してが消えます。どういうわけか、私は本当にDismiss
ボタンを検出してそれを無視するメソッドが欲しいのです。方法を知っているなら、私に教えてください!
ISこれを行う方法があります。UIKeyboard
サブクラスのためUIWindow
、UIKeyboard
の邪魔をするのに十分な大きさの唯一のものは、別のUIWindow
です。
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coverKey) name:UIKeyboardDidShowNotification object:nil];
[super viewDidLoad];
}
- (void)coverKey {
CGRect r = [[UIScreen mainScreen] bounds];
UIWindow *myWindow = [[UIWindow alloc] initWithFrame:CGRectMake(r.size.width - 50 , r.size.height - 50, 50, 50)];
[myWindow setBackgroundColor:[UIColor clearColor]];
[super.view addSubview:myWindow];
[myWindow makeKeyAndVisible];
}
これはiPhoneアプリで機能します。 iPadで試したことはありません。 myWindow
のサイズを調整する必要があるかもしれません。また、myWindow
ではmem管理を行いませんでした。だから、それも検討してください。
私は良い解決策を見つけたと思います。
BOOLをインスタンス変数として追加し、それをshouldBeginCalledBeforeHand
と呼びましょう。
次に、次のメソッドを実装します。
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
shouldBeginCalledBeforeHand = YES;
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
return shouldBeginCalledBeforeHand;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
shouldBeginCalledBeforeHand = NO;
}
と同様
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
return NO;
}
キーボードが戻るボタンで消えないようにするため。秘訣は、あるテキストフィールドから別のテキストフィールドへのフォーカス切り替えにより、事前にtextFieldShouldBeginEditingがトリガーされることです。キーボードの閉じるボタンが押された場合、これは起こりません。テキストフィールドがフォーカスを取得すると、フラグはリセットされます。
私は完璧ではない解決策しか考えられません。通知UIKeyboardDidHideNotification
を聞いて、テキストフィールドのファーストレスポンダーをもう一度作成します。これにより、キーボードが見えなくなり、再び元に戻ります。 UIKeyboardWillHideNotificationをリッスンし、didHideでそれに焦点を当てることで、どのテキストフィールドが最後のfirstResponderであったかを記録できます。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:nil];
...
- (void)keyboardDidHide:(id)sender
{
[myTextField becomeFirstResponder];
}
IOS9/10およびSwift 3の場合、これを使用して、「キーボードを非表示」に重なる長方形を作成します-ボタン
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil)
}
func coverKey() {
if let keyboardWindow = UIApplication.shared.windows.last {
let r = UIScreen.main.bounds
let myWindow = UIWindow.init(frame: CGRect(x: r.size.width - 50 , y: r.size.height - 50, width: 50, height: 50))
myWindow.backgroundColor = UIColor.clear
myWindow.isHidden = false
keyboardWindow.addSubview(myWindow)
keyboardWindow.bringSubview(toFront: myWindow)
}
}
これにより、メインウィンドウではなくキーボードウィンドウにサブビューが追加されることに注意してください。
キーボードの閉じるボタンの上にカスタムを追加して、ユーザーが閉じるボタンをタブで移動できないようにしてください。私は自分のアプリケーションの1つでこの方法を使用しました。
- (void)addButtonToKeyboard {
// create custom button
UIButton *blockButton = [UIButton buttonWithType:UIButtonTypeCustom];
blockButton.frame = //set the frame here, I don't remember the exact frame
[blockButton setImage:[UIImage imageNamed:@"block_button.png"] forState:UIControlStateNormal];
// locate keyboard view
UIWindow *appWindows = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView *keyboard;
for (int i=0; i<[appWindows.subviews count]; i++) {
keyboard = [appWindows.subviews objectAtIndex:i];
// keyboard found, add the button
if ([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES && [self.textField isFirstResponder]) {
[keyboard addSubview:doneButton];
}
}
}