using System; using System.Drawing; using Foundation; using UIKit; namespace HDL_ON_iOS { public class ViewControllerBase : Shared.BaseViewController { //public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) //{ // return false; //} NSObject _keyboardObserverWillShow; NSObject _keyboardObserverWillHide; //public override bool ShouldAutorotate () //{ // return false; //} //public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations () //{ // if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) { // UIApplication.SharedApplication.SetStatusBarOrientation (UIInterfaceOrientation.LandscapeRight, false); // return UIInterfaceOrientationMask.LandscapeRight; // } else { // return UIInterfaceOrientationMask.Portrait; // } //} public override void ViewDidLoad () { base.ViewDidLoad (); //设置键盘事件处理程序 RegisterForKeyboardNotifications (); } protected virtual void RegisterForKeyboardNotifications () { _keyboardObserverWillShow = NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillShowNotification, KeyboardWillShowNotification); _keyboardObserverWillHide = NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillHideNotification, KeyboardWillHideNotification); } protected virtual void UnregisterKeyboardNotifications () { NSNotificationCenter.DefaultCenter.RemoveObserver (_keyboardObserverWillShow); NSNotificationCenter.DefaultCenter.RemoveObserver (_keyboardObserverWillHide); } protected virtual UIView KeyboardGetActiveView () { return this.View.FindFirstResponder (); } protected virtual void KeyboardWillShowNotification (NSNotification notification) { UIView activeView = KeyboardGetActiveView (); if (activeView == null) return; UIView scrollView = activeView.FindSuperviewOfType_Self (this.View, typeof (UIView)) as UIView; if (scrollView == null) return; CoreGraphics.CGRect keyboardBounds = UIKeyboard.BoundsFromNotification (notification); //UIEdgeInsets contentInsets = new UIEdgeInsets (0.0f, 0.0f, keyboardBounds.Size.Height, 0.0f); //scrollView.ContentInset = contentInsets; //scrollView.ScrollIndicatorInsets = contentInsets; CoreGraphics.CGRect viewRectAboveKeyboard = new CoreGraphics.CGRect (this.View.Frame.Location, new CoreGraphics.CGSize (this.View.Frame.Width, this.View.Frame.Size.Height - keyboardBounds.Size.Height)); CoreGraphics.CGRect activeFieldAbsoluteFrame = activeView.Superview.ConvertRectToView (activeView.Frame, this.View); if (!viewRectAboveKeyboard.Contains (activeFieldAbsoluteFrame)) { //PointF scrollPoint = new PointF (0.0f, // (float)(activeFieldAbsoluteFrame.Location.Y + activeFieldAbsoluteFrame.Height // + scrollView.ContentOffset.Y - viewRectAboveKeyboard.Height)); // scrollView.SetContentOffset (scrollPoint, true); scrollView.Bounds = new CoreGraphics.CGRect (0.0f, (float)(activeFieldAbsoluteFrame.Location.Y + activeFieldAbsoluteFrame.Height + scrollView.Frame.Y - viewRectAboveKeyboard.Height) , this.View.Frame.Width, this.View.Frame.Height); } //if (this.View.Frame.Height - activeView.Frame.Bottom < keyboardBounds.Size.Height) // scrollView.Bounds = new CoreGraphics.CGRect (0.0f, this.View.Frame.Height - activeView.Frame.Height - keyboardBounds.Size.Height, this.View.Frame.Width, this.View.Frame.Height); } protected virtual void KeyboardWillHideNotification (NSNotification notification) { UIView activeView = KeyboardGetActiveView (); if (activeView == null) return; UIView scrollView = activeView.FindSuperviewOfType_Self (this.View, typeof (UIView)) as UIView; if (scrollView == null) return; double animationDuration = UIKeyboard.AnimationDurationFromNotification (notification); //UIEdgeInsets contentInsets = new UIEdgeInsets (0.0f, 0.0f, 0.0f, 0.0f); //UIView.Animate (animationDuration, delegate { // scrollView.ContentInset = contentInsets; // scrollView.ScrollIndicatorInsets = contentInsets; //}); scrollView.Bounds = new CoreGraphics.CGRect (0.0f, 0.0f, this.View.Frame.Width, this.View.Frame.Height); } } public static class ViewExtensions { public static UIView FindFirstResponder (this UIView view) { if (view.IsFirstResponder) { return view; } foreach (UIView subView in view.Subviews) { var firstResponder = subView.FindFirstResponder (); if (firstResponder != null) return firstResponder; } return null; } public static UIView FindSuperviewOfType (this UIView view, UIView stopAt, Type type) { if (view.Superview != null) { if (type.IsAssignableFrom (view.Superview.GetType ())) { return view.Superview; } if (view.Superview != stopAt) return view.Superview.FindSuperviewOfType (stopAt, type); } return null; } public static UIView FindSuperviewOfType_Self (this UIView view, UIView stopAt, Type type) { if (view.Superview != null) { return view.Superview.FindSuperviewOfType_Self (stopAt, type); } return view; } } }