zoukankan      html  css  js  c++  java
  • Monotouch 移动位于键盘下的内容,自动滚动被键盘遮住的内容

    IOS官方的Object-C有例子,但是OC的代码。Moving Content That Is Located Under the Keyboard

    效果如下图:

    滚动键盘下的内容

    实现方法:

    1.定义一个所有ViewControl的基类,命名为ViewControllerBase,ViewControl继承ViewControllerBase

    代码如下:

       1: public class ViewControllerBase : UIViewController
       2: {
       3:     NSObject _keyboardObserverWillShow;
       4:     NSObject _keyboardObserverWillHide;
       5:  
       6:     public ViewControllerBase()
       7:     {
       8:     }
       9:     public ViewControllerBase(IntPtr handle) : base(handle)
      10:     {
      11:  
      12:     }
      13:  
      14:     public override void ViewDidLoad()
      15:     {
      16:         //设置键盘事件处理程序
      17:         RegisterForKeyboardNotifications();
      18:     }
      19:  
      20:     protected virtual void RegisterForKeyboardNotifications()
      21:     {
      22:         _keyboardObserverWillShow = NSNotificationCenter.DefaultCenter.AddObserver
      23:             (UIKeyboard.WillShowNotification, KeyboardWillShowNotification);
      24:  
      25:         _keyboardObserverWillHide = NSNotificationCenter.DefaultCenter.AddObserver
      26:             (UIKeyboard.WillHideNotification, KeyboardWillHideNotification);
      27:     }
      28:  
      29:     protected virtual void UnregisterKeyboardNotifications()
      30:     {
      31:         NSNotificationCenter.DefaultCenter.RemoveObserver(_keyboardObserverWillShow);
      32:         NSNotificationCenter.DefaultCenter.RemoveObserver(_keyboardObserverWillHide);
      33:     }
      34:  
      35:     protected virtual UIView KeyboardGetActiveView()
      36:     {
      37:         return this.View.FindFirstResponder();
      38:     }
      39:  
      40:     protected virtual void KeyboardWillShowNotification(NSNotification notification)
      41:     {
      42:         UIView activeView = KeyboardGetActiveView();
      43:         if (activeView == null)
      44:             return;
      45:  
      46:         UIScrollView scrollView = activeView.FindSuperviewOfType(this.View, typeof(UIScrollView)) as UIScrollView;
      47:         if (scrollView == null)
      48:             return;
      49:  
      50:         RectangleF keyboardBounds = UIKeyboard.BoundsFromNotification(notification);
      51:  
      52:         UIEdgeInsets contentInsets = new UIEdgeInsets(0.0f, 0.0f, keyboardBounds.Size.Height, 0.0f);
      53:         scrollView.ContentInset = contentInsets;
      54:         scrollView.ScrollIndicatorInsets = contentInsets;
      55:  
      56:         RectangleF viewRectAboveKeyboard = new RectangleF(this.View.Frame.Location,
      57:             new SizeF(this.View.Frame.Width, this.View.Frame.Size.Height - keyboardBounds.Size.Height));
      58:  
      59:         RectangleF activeFieldAbsoluteFrame = activeView.Superview.ConvertRectToView(activeView.Frame, this.View);
      60:  
      61:         if (!viewRectAboveKeyboard.Contains(activeFieldAbsoluteFrame))
      62:         {
      63:             PointF scrollPoint = new PointF(0.0f, 
      64:                 activeFieldAbsoluteFrame.Location.Y + activeFieldAbsoluteFrame.Height
      65:                 + scrollView.ContentOffset.Y - viewRectAboveKeyboard.Height);
      66:             scrollView.SetContentOffset(scrollPoint, true);
      67:         }
      68:     }
      69:  
      70:     protected virtual void KeyboardWillHideNotification(NSNotification notification)
      71:     {
      72:         UIView activeView = KeyboardGetActiveView();
      73:         if (activeView == null)
      74:             return;
      75:  
      76:         UIScrollView scrollView = activeView.FindSuperviewOfType(this.View, typeof(UIScrollView)) as UIScrollView;
      77:         if (scrollView == null)
      78:             return;
      79:  
      80:         double animationDuration = UIKeyboard.AnimationDurationFromNotification(notification);
      81:         UIEdgeInsets contentInsets = new UIEdgeInsets(0.0f, 0.0f, 0.0f, 0.0f);
      82:         UIView.Animate(animationDuration, delegate
      83:         {
      84:             scrollView.ContentInset = contentInsets;
      85:             scrollView.ScrollIndicatorInsets = contentInsets;
      86:         });
      87:     }
      88: }
    2.定义UIView的扩展方法

    代码如下:

       1: public static class ViewExtensions
       2: {
       3:     public static UIView FindFirstResponder(this UIView view)
       4:     {
       5:         if (view.IsFirstResponder)
       6:         {
       7:             return view;
       8:         }
       9:         foreach (UIView subView in view.Subviews)
      10:         {
      11:             var firstResponder = subView.FindFirstResponder();
      12:             if (firstResponder != null)
      13:                 return firstResponder;
      14:         }
      15:         return null;
      16:     }
      17:  
      18:     public static UIView FindSuperviewOfType(this UIView view, UIView stopAt, Type type)
      19:     {
      20:         if (view.Superview != null)
      21:         {
      22:             if (type.IsAssignableFrom(view.Superview.GetType()))
      23:             {
      24:                 return view.Superview;
      25:             }
      26:  
      27:             if (view.Superview != stopAt)
      28:                 return view.Superview.FindSuperviewOfType(stopAt, type);
      29:         }
      30:  
      31:         return null;
      32:     }
      33: }

    实现的效果:

    滚动1滚动2

    作者:Bruce Lee
    出处:http://www.cnblogs.com/BruceLee521
    本博原创文章版权归博客园和本人共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出作者名称和原文连接,否则保留追究法律责任的权利。

     
    分类: Monotouch
    标签: MonotouchIPadIOS
  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2758194.html
Copyright © 2011-2022 走看看