LoginSignup
3
3

More than 5 years have passed since last update.

Xamarin.iOSで入力欄がソフトウェアキーボードに隠れないようにする

Last updated at Posted at 2017-05-26

初めに

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);
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3