13

TPKeyboardAvoidingApple の有名なソリューション、および UIScrollView の使用に関するさまざまな提案など、多くの同様のソリューションがあることを認識しています。私の場合、キーボードをスクロールまたは移動するのではなく、キーボードに合わせてビューのサイズを変更する必要があります。このソリューションは、私が達成しようとしていることに最も近いので、それが私の基礎でした。ただし、横向きモードで動作させるのに問題があります。キーボードが表示されたときにビューのサイズを変更する私の方法は次のとおりです。

- (void)keyboardWillShow:(NSNotification *)note {
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];

    CGRect keyboardFrame = [[self textField].superview convertRect:[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
    CGRect statusBarFrame = [[self textField].superview convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil];

    CGRect bounds = [self textField].superview.bounds;    
    CGRect newFrame = CGRectMake(0.0, 0.0, bounds.size.width, keyboardFrame.origin.y + statusBarFrame.size.height);
    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        [self textField].superview.frame = newFrame;
    } completion:nil];
}

これはポートレートモードで完全に機能します。

ここに画像の説明を入力

ただし、横向きモードでは、ビューは、下からではなく、デバイスが回転された方向に応じて、左から右または右から左にサイズ変更されます。

ここに画像の説明を入力

明らかに、座標の使用方法に問題があり、ランドスケープ モードのときの基準フレームとは異なりますが、それを解決する方法を整理するのにかなりの時間を費やしています。-convertRect: を使用してあらゆる種類のものを変換しようとしましたが、私が試みていることは何もありません。

これらすべての長方形と、向きが変わったときに長方形がどのように変化するかについて混乱していない人が、私が間違っていることと、これを正しく行うために何をする必要があるかを見つけてくれることを本当に望んでいます. 参考までに、私が抱えている問題を再現する最も単純なケースを示すプロジェクトを作成しました。

4

5 に答える 5

6

Vitaliy Bの迅速な回答。templateHeaderContentView というビューを取得し、関数を作成してビューの高さを設定しました。独自のビューを使用し、それに応じて高さを変更します。

func keyboardWillShow(notification: NSNotification) {
    keyboardShowOrHide(notification)
}

func keyboardWillHide(notification: NSNotification) {
    keyboardShowOrHide(notification)
}

private func keyboardShowOrHide(notification: NSNotification) {
    guard let userInfo = notification.userInfo else {return}
    guard let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey]else { return }
    guard let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] else { return }
    guard let keyboardFrameEnd = userInfo[UIKeyboardFrameEndUserInfoKey] else { return }

    let curveOption = UIViewAnimationOptions(rawValue: UInt(curve.integerValue << 16))
    let keyboardFrameEndRectFromView = view.convertRect(keyboardFrameEnd.CGRectValue, fromView: nil)
    UIView.animateWithDuration(duration.doubleValue ?? 1.0,
        delay: 0,
        options: [curveOption, .BeginFromCurrentState],
        animations: { () -> Void in
            self.templateHeaderContentView.configureView(keyboardFrameEndRectFromView.origin.y)
        }, completion: nil)
}
于 2015-11-18T20:15:47.217 に答える