轉(zhuǎn)載自:
http://blog.csdn.net/assholeu/article/details/38714123
如果你有下面的問題,此文也許會幫到你豁遭。
- 鍵盤遮蓋了UIWebView叭喜。
- 如何拖動UIWebView來移除鍵盤。
- 鍵盤出現(xiàn)時UIWebView里面的Content內(nèi)容向上移動蓖谢,以至聚焦的文本框超出了UIWebView的可視區(qū)域捂蕴。
- 如何在鍵盤彈出時禁止UIWebView里面的Content向上移動。
- 無法在UIWebView中獲取到坐標(biāo)闪幽,來計算contentOffset得到想要展示的結(jié)果啥辨。
一步一步說明:
1. 喚出移除鍵盤
只要點擊UIWebView里面的html文本框控件,會自動彈出鍵盤盯腌。當(dāng)然你需要獲取鍵盤的信息(高度等)溉知,方法還是使用UIViewController+Notification的方式,代碼如下:
// UIKeyboardWillShowNotification和UIKeyboardWillHideNotification為鍵盤彈出或移除時iOS系統(tǒng)post notification的名字腊嗡,這里只需要定義self為這個通知的接收者即可着倾。
// viewWillAppear:和viewWillDisappear:大家應(yīng)該都很清楚拾酝,這兩個方法分別在self loadView和removefromsuperview后執(zhí)行燕少。
// 特別注意:這里的object參數(shù)需要是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
// 你的操作,如鍵盤出現(xiàn)蒿囤,控制視圖上移等
}
- (void)keyboardWillHide:(NSNotification *)notification {
// 獲取info同上面的方法
// 你的操作客们,如鍵盤移除,控制視圖還原等
}
2. 通過拖動UIWebView來移除鍵盤
self.webView.scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; // 當(dāng)拖動時移除鍵盤
如果是iOS7以下材诽,請參照 6 來設(shè)置底挫,大概思路,先添加一個private的flag表明現(xiàn)在鍵盤是否存在脸侥,當(dāng)存在時建邓,通過 6 來獲取事件關(guān)閉鍵盤。
3. 鍵盤遮蓋了UIWebView
這個的解決方法可在 1 中的keyboardWillShow:里面操作睁枕,通過改變webView的origin來實現(xiàn)官边。
4. 鍵盤出現(xiàn)時UIWebView里面的Content內(nèi)容向上移動,以至聚焦的文本框超出了UIWebView的可視區(qū)域
在UIWebView中外遇,只要鍵盤出現(xiàn)注簿,UIWebView肯定會向上移動,至于合不合適就不好說了跳仿,如果不合適诡渴,就只用禁用自動移動。
5. 如何在鍵盤彈出時禁止UIWebView里面的Content向上移動
這個方法菲语,我也找了很久妄辩,但是還是找到了惑灵,感謝強(qiáng)大的網(wǎng)友,代碼如下:
@interface XXX : UIViewController<UIScrollViewDelegate> // 添加UIScrollViewDelegate眼耀, step 1
self.webView.scrollView.delegate = self; // 注冊代理泣棋, step 2
- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView{ // 實現(xiàn)代理方法, step 3
return nil;
}
6. 如何在UIWebView中獲取點擊坐標(biāo)
眾所周知畔塔,UIWebView會吃掉所有的touch事件潭辈,不然也不會有那么多人費工夫弄javascript了,但是不能設(shè)置不代表不能以另外一種方式代替澈吨,大概思路:給webView的superView添加手勢把敢,然后通過實現(xiàn)多手勢過濾設(shè)置來實現(xiàn),為什么要設(shè)置多手勢過濾呢谅辣?我這里說明一下修赞,由于UIWebView默認(rèn)有自己的手勢,它會攔截掉你的手勢桑阶,以至 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];
// 設(shè)置過濾割择,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中的坐標(biāo),如果改成self.view則獲取相對于superView中的坐標(biāo)虐杯, step 4
NSLog(@"tapPoint x:%f y:%f",tapPoint.x,tapPoint.y);
}
UIWebView鍵盤處理能想起的就只有這些了玛歌,歡迎大家補(bǔ)充。
轉(zhuǎn)載自:
http://blog.csdn.net/assholeu/article/details/38714123
資料參考:
感謝 http://blog.csdn.net/abel_tu/article/details/12134261