Swift を使用している場合は、プロトコル指向プログラミングを使用するのが最善の方法だと思います。
まず、KeyboardCapable
プロトコルを作成する必要があります。これにより、それに準拠する UIViewController に、キーボード オブザーバーを登録および登録解除する機能が与えられます。
import Foundation
import UIKit
protocol KeyboardCapable: KeyboardAnimatable {
func keyboardWillShow(notification: NSNotification)
func keyboardWillHide(notification: NSNotification)
}
extension KeyboardCapable where Self: UIViewController {
func registerKeyboardNotifications() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil)
}
func unregisterKeyboardNotifications() {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}
}
KeyboardAnimatable
上記のコード部分に不要なキーワードがあることに気付きました。これは、作成する必要がある次のプロトコルの名前にすぎません。
import Foundation
import UIKit
protocol KeyboardAnimatable {
}
extension KeyboardAnimatable where Self: UIViewController {
func performKeyboardShowFullViewAnimation(withKeyboardHeight height: CGFloat, andDuration duration: NSTimeInterval) {
UIView.animateWithDuration(duration, animations: { () -> Void in
self.view.frame = CGRectMake(view.frame.origin.x, -height, view.bounds.width, view.bounds.height)
}, completion: nil)
}
func performKeyboardHideFullViewAnimation(withDuration duration: NSTimeInterval) {
UIView.animateWithDuration(duration, animations: { () -> Void in
self.view.frame = CGRectMake(view.frame.origin.x, 0.0, view.bounds.width, view.bounds.height)
}, completion: nil)
}
}
このKeyboardAnimatable
プロトコルは、ビュー全体をそれぞれ上下にアニメーション化する 2 つのメソッドに準拠するすべての UIViewController を提供します。
に準拠している場合、にKeyboardCapable
準拠してKeyboardAnimatable
いるすべての UIViewControllerKeyboardCapable
も に準拠していKeyboardAnimatable
ます。カッコいい。
UIViewController
準拠KeyboardCapable
し、キーボード イベントに反応する を見てみましょう。
import Foundation
import UIKit
class TransferConfirmViewController: UIViewController, KeyboardCapable {
//MARK: - LIFE CYCLE
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
registerKeyboardNotifications()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
unregisterKeyboardNotifications()
}
//MARK: - NOTIFICATIONS
//MARK: Keyboard
func keyboardWillShow(notification: NSNotification) {
let keyboardHeight = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().height
let animationDuration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
performKeyboardShowFullViewAnimation(withKeyboardHeight: keyboardHeight, andDuration: animationDuration)
}
func keyboardWillHide(notification: NSNotification) {
let animationDuration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
performKeyboardHideFullViewAnimation(withDuration: animationDuration)
}
}
UIViewController
これで、キーボード イベントに応答し、結果としてアニメーション化されます。
注: ビューをプッシュまたはプルする代わりにカスタム アニメーションが必要な場合は、KeyboardAnimatable
プロトコルでカスタム メソッドを定義するか、KeyboardCapable
関数でそれらを実行する必要があります。それはあなた次第です。