WJC
2019-12-30 f1c3921b08bb22ac6f5db22d620e01d7e8e5c49f
ZigbeeApp/GateWay.Ios/ViewControllerBase.cs
New file
@@ -0,0 +1,137 @@
using System;
using System.Drawing;
using Foundation;
using UIKit;
namespace GateWay.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;
        }
    }
}