3

UIPresentationControllerキーボードが表示されたときに、アニメーションを使用してカスタムの提示されたビューのフレームを調整する必要があります。

自動的に追加された制約により、アニメーションが機能していないようです。これらの制約を変更してアニメーションを作成しようとしましたが、失敗しました。

過去 8 時間、この問題を解決しようとしましたが、失敗しました。UIPresentationControllerまた、ドキュメントには有用な情報が見つかりませんでした。この問題を解決する方法を誰かにアドバイスしてもらえますか?

modalPresentationStyle .Popover に似た効果を再現しようとしています。フレームの高さと原点を小さくするだけで、キーボードがコンテンツをカバーしなくなります。

キーボードが表示されたときにフレームを適応させたい。

提示されたVCの例:

import UIKit
class CustomSaleViewController: UIViewController {

private let animationDuration: Double = 0.5

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    modalPresentationStyle = UIModalPresentationStyle.Custom
}


private var originalFrameBeforeKeyboardAppread: CGRect?
func keyboardWillShow(notification: NSNotification) {

    if originalFrameBeforeKeyboardAppread == nil { originalFrameBeforeKeyboardAppread = view.frame }

    let keyboardHeight = notification.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue.height
    let remainingVisibleHeight = Utils.window()!.frame.height - keyboardHeight
    let preferedSpacing: CGFloat = 20
    let maxHeight = remainingVisibleHeight - preferedSpacing * 2

    if remainingVisibleHeight > view.frame.height - preferedSpacing {
        UIView.animateWithDuration(animationDuration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut , animations: {
            self.view.frame.origin.y = preferedSpacing
            self.view.frame.size.height = maxHeight
            }, completion: nil)
    }
}

func keyboardWillHide(notification: NSNotification) {
    if originalFrameBeforeKeyboardAppread != nil {
        UIView.animateWithDuration(animationDuration, animations: {
            self.view.frame = self.originalFrameBeforeKeyboardAppread!
            }, completion: nil)
    }
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

}
4

0 に答える 0