标签:
在 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 事件 )
标签:
原文地址:http://www.cnblogs.com/Liddle/p/5329490.html