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)
}
}