zoukankan      html  css  js  c++  java
  • iOS UIWebView键盘操控

    +-------------------------+

    假设你有以下的问题,也许这篇文章将帮助你。

    1. 键盘遮盖了UIWebView。
    2. 怎样拖动UIWebView来移除键盘。

    3. 键盘出现时UIWebView里面的Content内容向上移动。以至聚焦的文本框超出了UIWebView的可视区域。

    4. 怎样在键盘弹出时禁止UIWebView里面的Content向上移动。
    5. 无法在UIWebView中获取到坐标,来计算contentOffset得到想要展示的结果。

    +-------------------------+


    一步一步说明:

    1.  唤出移除键盘

    仅仅要点击UIWebView里面的html文本框控件,会自己主动弹出键盘。

    当然你须要获取键盘的信息(高度等),方法还是使用UIViewController+Notification的方式,代码例如以下:

    // UIKeyboardWillShowNotification和UIKeyboardWillHideNotification为键盘弹出或移除时iOS系统post notification的名字,这里仅仅须要定义self为这个通知的接收者就可以。
    // viewWillAppear:和viewWillDisappear:大家应该都非常清楚,这两个方法分别在self loadView和removefromsuperview后运行。
    // 特别注意:这里的object參数须要是nil,不然取不到键盘的userInfo
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
        
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    }
    
    - (void)keyboardWillShow:(NSNotification *)notification {
        NSDictionary *userInfo = [notification userInfo];
        NSValue* value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardRect = [value CGRectValue]; // 这里得到了键盘的frame
        // 你的操作,如键盘出现。控制视图上移等
    }
    
    - (void)keyboardWillHide:(NSNotification *)notification {
        // 获取info同上面的方法
        // 你的操作,如键盘移除。控制视图还原等
    }

    2. 通过拖动UIWebView来移除键盘

    在网上看见非常多人为了实现这个功能做了非常多操作。但在iOS7中apple已为我们提供了这些。代码例如以下:

    self.webView.scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; // 当拖动时移除键盘

    假设是iOS7下面,请參照 6 来设置,大概思路,先加入一个private的flag表明如今键盘是否存在,当存在时,通过 6 来获取事件关闭键盘。

    3. 键盘遮盖了UIWebView

    这个的解决方法可在 1 中的keyboardWillShow:里面操作。通过改变webView的origin来实现。

    4. 键盘出现时UIWebView里面的Content内容向上移动。以至聚焦的文本框超出了UIWebView的可视区域

    在UIWebView中,仅仅要键盘出现。UIWebView肯定会向上移动,至于合不合适就不好说了,假设不合适。就仅仅用禁用自己主动移动。

    5. 怎样在键盘弹出时禁止UIWebView里面的Content向上移动

    这种方法。我也找了非常久。可是还是找到了,感谢强大的网友,代码例如以下:

    @interface XXX : UIViewController<UIScrollViewDelegate> // 加入UIScrollViewDelegate, step 1
    
    self.webView.scrollView.delegate = self; // 注冊代理。 step 2
    
    - (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView{ // 实现代理方法, step 3
            return nil;
    }

    6. 怎样在UIWebView中获取点击坐标

    众所周知,UIWebView会吃掉全部的touch事件。不然也不会有那么多人费工夫弄javascript了,可是不能设置不代表不能以第二种方式取代。大概思路:给webView的superView加入手势,然后通过实现多手势过滤设置来实现。为什么要设置多手势过滤呢?我这里说明一下,因为UIWebView默认有自己的手势,它会拦截掉你的手势,以至superView无法接收手势。代码例如以下:

    @interface XXX : UIViewController<UIGestureRecognizerDelegate> // 加入UIGestureRecognizerDelegate, step 1
    
    // 加入手势, step 2
    UITapGestureRecognizer *webTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(webTap:)];
    webTap.numberOfTouchesRequired = 1;
    webTap.numberOfTapsRequired = 1;
    webTap.delegate = self;
    webTap.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:webTap];
    
    // 设置过滤,ruturn YES为同一时候接收,至此手势能够透过webView。让你的superView也能够接收到了, step 3
    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
            return YES;
    }
    
    - (void)webTap:(UITapGestureRecognizer *)sender{
            CGPoint tapPoint = [sender locationInView:self.webView.scrollView]; // 获取相对于webView中的坐标,假设改成self.view则获取相对于superView中的坐标, step 4
            NSLog(@"tapPoint x:%f y:%f",tapPoint.x,tapPoint.y);
    }

    UIWebView键盘处理能想起的就仅仅有这些了,欢迎大家补充。

    BB:转载请注明出处 http://blog.csdn.net/assholeu/article/details/38714123

    资料參考:
    感谢 http://blog.csdn.net/abel_tu/article/details/12134261


  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4592005.html
Copyright © 2011-2022 走看看