国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS中表單列表樣式鍵盤遮擋的解決方案

2020-07-26 02:21:57
字體:
來源:轉載
供稿:網友

前言

近期參與了一個招聘類app的開發,注冊流程比較多,基本都是cell帶輸入框的表單列表樣式,避免不了的就會遇到鍵盤遮擋問題。相信大家也一定遇到過類似的問題,今天在這里就給大家分享一下,這個問題的解決思路。

實現方案

我們先來分析一下這個需求,首先,這個表單是一個列表list(UITableView或者UICollectionView),如圖1所示,當用戶點擊輸入框1、2、3、4、5的時候,彈出鍵盤但不會被遮擋,這種情況,不用做處理,當用戶點擊輸入框6、7、8,彈出鍵盤會遮擋輸入框,想要讓輸入框顯示出來,我們有兩個辦法,第一可以向上修改整個列表view的frame的y值,第二可以修改列表的contentoffset的y值,都可以達到效果,下邊我們選擇第二種方式來實現我們的需求。

具體實現分以下幾步:

  • 監聽鍵盤彈起和收起事件
  • 計算鍵盤高度
  • 計算contentoffset的y值要改變的差值并修改contentoffset的值
  • 滑動列表時收起鍵盤
  • 鍵盤收起時還原contentoffset的值


圖1

下面一起來通過代碼實現這個5步

第一步__設置監聽

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillShowNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillHideNotification object:nil];

第二步__計算高度

// 鍵盤監聽事件- (void)keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //鍵盤高度 CGFloat height = [value CGRectValue].size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) {   //鍵盤彈起時 } else {   //鍵盤收起時 } }

第三步__計算contentoffset的y值要改變的差值并修改contentoffset的值

我們以點擊第7個輸入框為例,當點擊第7個輸入框的時候,我們想要的效果是讓第7個輸入框跑到鍵盤上邊,如圖2所示

圖2

那么這里我們就要計算一下需要向上移動的距離delta=3-(2-1),2是list的高度,1是鍵盤的高度,3是第7個輸入框所在cell的maxY值-當前list的contentoffset的y值,如圖3,

圖3

1和2我們很好獲得,重點是獲取3的值,我們只要獲取到第7個輸入框所在cell的實例,然后通過CGRectGetMaxY(cell.frame)即可獲得此值。下邊是獲取到cell實例的代碼

- (UICollectionViewCell *)firstResponderCell { __block UICollectionViewCell *cell = nil; [self.collectionView.visibleCells enumerateObjectsUsingBlock:^(__kindof UICollectionViewCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {  UICollectionViewCell *visibleCell = obj;  //焦點所在的textField  if (visibleCell.textField.isFirstResponder) {   cell = visibleCell;  } }]; return cell;}

計算差值改變contentoffset

// 鍵盤監聽事件- (void)keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //鍵盤高度 CGFloat keyboardHeight = [value CGRectValue].size.height; //列表的高度 CGFloat collectionViewHeight = self.collectionView.frame.size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) {  //鍵盤彈出時  //獲取輸入框焦點所在的cell  UICollectionViewCell *cell = [self firstResponderCell];  if (cell) {   //cell的maxY值   CGFloat cellMaxY = CGRectGetMaxY(cell.frame)- self.collectionView.contentOffset.y;   //差值 = 3 -(2-1)   if (cellMaxY > collectionViewHeight-keyboardHeight) {    //記錄delta值,鍵盤收起恢復原來位置時使用    self.delta = cellMaxY-(collectionViewHeight-keyboardHeight);    self.collectionView.contentOffset = CGPointMake(0, self.collectionView.contentOffset.y+self.delta);   }  } } else {   //鍵盤收起時 } }

第四步__滑動列表時收起鍵盤

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { UICollectionViewCell *cell = [self firstResponderCell]; if (cell) {  [cell.textField resignFirstResponder];   }}

第五步__鍵盤收起時還原contentoffset的值

// 鍵盤監聽事件- (void)keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //鍵盤高度 CGFloat keyboardHeight = [value CGRectValue].size.height; //列表的高度 CGFloat collectionViewHeight = self.collectionView.frame.size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) {  //鍵盤出現時 } else {  //鍵盤收起時  //根據self.delta復原  self.collectionView.contentOffset = CGPointMake(0, self.collectionView.contentOffset.y-self.delta);  self.delta = 0 }}

實現完畢,怎么樣,是不是很簡單~~~~~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漠河县| 航空| 金阳县| 乌拉特前旗| 若尔盖县| 元朗区| 开平市| 政和县| 夏河县| 桐庐县| 五家渠市| 凤冈县| 惠州市| 绥阳县| 明光市| 南开区| 巩留县| 岗巴县| 舟山市| 玛纳斯县| 邹平县| 岗巴县| 浮山县| 镶黄旗| 昌邑市| 资中县| 平泉县| 江源县| 南昌县| 济阳县| 东安县| 华容县| 连城县| 阳曲县| 微博| 三穗县| 会宁县| 贵阳市| 江口县| 崇州市| 汉川市|