iOS UIWebView键盘处理(转载)

转载自:
http://blog.csdn.net/assholeu/article/details/38714123

如果你有下面的问题,此文也许会帮到你。

  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来移除键盘

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键盘处理能想起的就只有这些了,欢迎大家补充。
转载自:
http://blog.csdn.net/assholeu/article/details/38714123

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 在此特此声明:一下所有链接均来自互联网,在此记录下我的查阅学习历程,感谢各位原创作者的无私奉献 ! 技术一点一点积...
    远航的移动开发历程阅读 11,115评论 12 197
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,117评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 我是小六,一个阳光充满正能量的大男孩。喜欢各种运动,健身,听音乐,读书,写字,擅长打乒乓球,长跑。是朋友圈里的运动...
    _小六阅读 214评论 6 1
  • 2017 7.3 关系攻略 为人处世如何更进一步 人际交往是我最为头疼的一件事,我是一个比较务实的人。做啥事习惯了...
    耕耘生活阅读 526评论 2 9