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


  • 相关阅读:
    WCF异常管理—不要在using语句中调用WCF服务(z)
    正则表达式
    nginx汇总(z)
    WCF编解码实现
    zTree -- jQuery 树插件
    C# 程序异常管理方案
    WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
    乘法逆元
    二叉树后序遍历(非递归)
    P1892 [BOI2003]团伙
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4592005.html
Copyright © 2011-2022 走看看