初めに
iOS向けの画面を作成している際に、TextFieldなりTextViewなりがSoftwareKeyboardに隠れてしまう残念な現象に遭遇したため、対応結果を残しておきます。
ソースコードは下記に置いております。
https://github.com/dyoneda/SoftKeyboard/
多いに下記記事を参考にさせて頂きました。
【Swift】UITextField, UITextViewがキーボードで隠れるのを防ぐ(UIScrollViewを使わずに)
http://qiita.com/ShinokiRyosei/items/06fb30983236d6342b28
実装
ViewDidLoadメソッドで、キーボードの表示/非表示を各々ハンドルします。
移動量は、ソフトウェアキーボードの高さと、画面下端から対象コントロールの下端までの差分にしておくと、入力コントロールがソフトウェアキーボードの直上に来ていい感じです。
今回はIsFirstResponderプロパティーでフォーカスが当たっているコントロールを取得しています。
var nsObject = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, n =>
{
var cgRectValue = (n.UserInfo[UIKeyboard.FrameBeginUserInfoKey] as NSValue).CGRectValue;
var d = (n.UserInfo[UIKeyboard.AnimationDurationUserInfoKey] as NSNumber).DoubleValue;
var active = this.View.Subviews.FirstOrDefault(u => u.IsFirstResponder);
var diff = this.View.Frame.Height - active?.Frame.Bottom ?? 0f;
UIView.Animate(d, () =>
{
var transform = CGAffineTransform.MakeTranslation(0f, -(float)Math.Max(cgRectValue.Height - diff, 0f));
this.View.Transform = transform;
});
});
nsObject = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, n =>
{
var d = (n.UserInfo[UIKeyboard.AnimationDurationUserInfoKey] as NSNumber).DoubleValue;
UIView.Animate(d, () =>
{
this.View.Transform = CGAffineTransform.MakeIdentity();
});
});
なお、AddObserverメソッドの戻り値のNSObjectは、ViewWillDisappearメソッドでハンドラー解放の際に利用するので保持しておきましょう。
this._removeObjects.ForEach(NSNotificationCenter.DefaultCenter.RemoveObserver);