Xamarin.iOS 的鍵盤控制 (AutoLayout 與 新的 Keyboard 事件 )

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.iOS 的鍵盤控制 (AutoLayout 與 新的 Keyboard 事件 )相关的知识,希望对你有一定的参考价值。

ios 增加了鍵盤類型之後,過去用來偵測鍵盤高度已調整 UITextField 位置的方法也需要改變。
加上目前的版面配置都是以 AutoLayout 為主。
此篇文章以這兩個前提為基礎撰寫。

(1) 使用 Storyboard 進行版面配置。
(2) 在 Storyboard 中,對 UITextField 新增 NSLayoutConstraint,控制 UITextField 下方間距。
(3) 註冊兩個事件。一為  WillChangeFrameNotification, 一為  WillChangeFrameNotification。
   透過這兩個事件,改變控制 UITextField 下方間距的 NSLayoutConstraint,達成控制 UITextField 位置的目標。

以下是操作過程:

(1) 在 Xamarin Studio 的專案中,指定以 Xcode 開啟Storyboard
    
    技术分享

(2) 在 UIViewController 的 View 中,將 UITextField 與 UIButton 配置於 View 的下緣。
    透過這個配置,展現如果不移動位置,使用者將難以輸入。

(3) 指定 UITextField 下緣對齊的 NSLayoutConstraint。讓程式可以控制 UITextField 的下緣距離。

    技术分享技术分享


(4) 在程式中的 ViewDidLoad 內

public override void ViewDidLoad ()

 註冊兩個 Keyboard 事件。

NSNotificationCenter.DefaultCenter.AddObserver( UIKeyboard.WillChangeFrameNotification, UIKeyboardWillChangeFrameNotification);
NSNotificationCenter.DefaultCenter.AddObserver( UIKeyboard.WillHideNotification, UIKeyboardWillHideNotification);

 

 

並且在這兩個方法內控制之前所提的 NSLayoutConstraint 的 Constant 值。

private void UIKeyboardWillHideNotification (NSNotification notification){
            NSString key = new NSString(UIKeyboard.FrameEndUserInfoKey.ToString());

            NSObject objRect = notification.UserInfo[key];

            if (objRect is NSValue) {
                var v = (NSValue)objRect;

                var rect = v.RectangleFValue;

                _currentKeyboardHight = (int)rect.Height;

                Debug.WriteLine ("Hide Keyboard Height:{0}", _currentKeyboardHight);
                txtUrlBottomConstraint.Constant = 5;
            }
        }

        private void UIKeyboardWillChangeFrameNotification(NSNotification notification){
            if(notification.UserInfo.ContainsKey( new NSString(UIKeyboard.FrameBeginUserInfoKey.ToString()))){


                NSString key = new NSString(UIKeyboard.FrameEndUserInfoKey.ToString());

                NSObject objRect = notification.UserInfo[key];

                if (objRect is NSValue) {
                    var v = (NSValue)objRect;

                    var rect = v.RectangleFValue;

                    _currentKeyboardHight = (int)rect.Height;

                    Debug.WriteLine ("Change Keyboard Height:{0}", _currentKeyboardHight);
                    txtUrlBottomConstraint.Constant = _currentKeyboardHight + 5;
                }
            }
        }

 

(5) 進行測試,即可發現 UITextField 位置由 NSLayoutConstraint 控制

以上是关于Xamarin.iOS 的鍵盤控制 (AutoLayout 與 新的 Keyboard 事件 )的主要内容,如果未能解决你的问题,请参考以下文章

C# Monotouch/Xamarin.iOS - 不支持推送导航控制器

在 xamarin.ios 中的视图控制器之间传递数据

无法在Portrait,xamarin IOS中锁定一个视图控制器

更改 RootView 控制器 Xamarin IOS 应用程序

MvvmCross 4 和 Xamarin.iOS -> 使用 Storyboard 时如何从 Core 加载视图控制器?

Xamarin iOS - 在列表视图行选择打开视图控制器