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
  • 相关阅读:
    Java的运算符
    Java的输入和输出
    ieda使用maven出现unable to find valid certification path to requested target问题解决
    linux设置mysql查询忽略表明大小写的配置
    idea插件GsonFormat的使用
    Charles抓包(iOS的http/https请求)
    (转)Java线上应用故障排查之一:高CPU占用
    基本功知识点
    MYSQL 什么时候用单列索引?什么使用用联合索引?(收集)
    Quartz定时器中的misfire指定解析
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2758194.html
Copyright © 2011-2022 走看看