web-dev-qa-db-ja.com

iOS8キーボードがテキストビューを非表示

self.accountViewController.modalPresentationStyle = UIModalPresentationFormSheet;を使用してUIViewControllerを表示しましたが、iOS 8では、最後のUITextViewが押し上げられるときにキーボードから非表示になります。それを回避する方法は?

23

@Olegのソリューションは優れていますが、キーボードのサイズの変更は考慮されていませんが、すでに表示されています。また、アニメーションの長さと他のいくつかのパラメーターをハードコーディングしました。以下の私の解決策を参照してください:

UIKeyboardWillChangeFrameNotificationのオブザーバーをviewDidLoadに追加します

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

次に、メソッドを追加します。

- (void)keyboardFrameWillChange:(NSNotification *)notification
{
    CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect keyboardBeginFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    UIViewAnimationCurve animationCurve = [[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    NSTimeInterval animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] integerValue];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    CGRect newFrame = self.view.frame;
    CGRect keyboardFrameEnd = [self.view convertRect:keyboardEndFrame toView:nil];
    CGRect keyboardFrameBegin = [self.view convertRect:keyboardBeginFrame toView:nil];

    newFrame.Origin.y -= (keyboardFrameBegin.Origin.y - keyboardFrameEnd.Origin.y);
    self.view.frame = newFrame;

    [UIView commitAnimations];
}

ViewDidUnloadとDeallocの両方でキーボードオブザーバーを削除することを忘れないでください。

57
newton_guima

Swift Versionof @ newton_guima's 誰かがそれを望む場合に備えて、上記の答え。

UIKeyboardWillChangeFrameNotificationのオブザーバーをviewDidLoad()に追加します。

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardFrameWillChange:", name: UIKeyboardWillChangeFrameNotification, object: nil)

次に、このメソッドを追加します。

func keyboardFrameWillChange(notification: NSNotification) {
    let keyboardBeginFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue
    let keyboardEndFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue

    let animationCurve = UIViewAnimationCurve(rawValue: (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationCurveUserInfoKey)!.integerValue)

    let animationDuration: NSTimeInterval = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationDurationUserInfoKey)!.doubleValue

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(animationDuration)
    UIView.setAnimationCurve(animationCurve!)

    var newFrame = self.view.frame
    let keyboardFrameEnd = self.view.convertRect(keyboardEndFrame, toView: nil)
    let keyboardFrameBegin = self.view.convertRect(keyboardBeginFrame, toView: nil)

    newFrame.Origin.y -= (keyboardFrameBegin.Origin.y - keyboardFrameEnd.Origin.y)
    self.view.frame = newFrame;

    UIView.commitAnimations()
}

次に、ビューから離れる場所、またはdeinit内のどこにでもオブザーバーを削除します。

NSNotificationCenter.defaultCenter().removeObserver(self)
5
myles

問題を解決するには、frameconstrainまたはtextviewを変更する必要があります。

あなたのための小さなヒント:

通知を使用して、キーボードがいつ表示または非表示になるかを検出します。

通知のサンプル:

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

そして、上記のパラメータの1つを変更するよりも。

フレーム変更の例:

- (void)keyboardWillHide:(NSNotification *)notification
{
    [self.view layoutIfNeeded];
    [UIView animateWithDuration:0.2
                     animations:^{
    [self setStartingFrame:self.commentsView.frame.size.height - commentViewOutlet_.frame.size.height - tabBarOffset_];
                         [self.view layoutIfNeeded];
                     }];
}
3
Oleg Gordiichuk