重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這篇文章將為大家詳細(xì)講解有關(guān)iOS中表單列表樣式鍵盤被遮擋如何解決,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)和西云機(jī)房的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗(yàn)和案例。
具體實(shí)現(xiàn)分以下幾步:
監(jiān)聽鍵盤彈起和收起事件
計(jì)算鍵盤高度
計(jì)算contentoffset的y值要改變的差值并修改contentoffset的值
滑動列表時收起鍵盤
鍵盤收起時還原contentoffset的值
圖1
下面一起來通過代碼實(shí)現(xiàn)這個5步
第一步__設(shè)置監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillHideNotification object:nil];
第二步__計(jì)算高度
// 鍵盤監(jiān)聽事件 - (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 { //鍵盤收起時 } }
第三步__計(jì)算contentoffset的y值要改變的差值并修改contentoffset的值
我們以點(diǎn)擊第7個輸入框?yàn)槔?dāng)點(diǎn)擊第7個輸入框的時候,我們想要的效果是讓第7個輸入框跑到鍵盤上邊,如圖2所示
圖2
那么這里我們就要計(jì)算一下需要向上移動的距離delta=3-(2-1),2是list的高度,1是鍵盤的高度,3是第7個輸入框所在cell的maxY值-當(dāng)前l(fā)ist的contentoffset的y值,如圖3,
圖3
1和2我們很好獲得,重點(diǎn)是獲取3的值,我們只要獲取到第7個輸入框所在cell的實(shí)例,然后通過CGRectGetMaxY(cell.frame)即可獲得此值。下邊是獲取到cell實(shí)例的代碼
- (UICollectionViewCell *)firstResponderCell { __block UICollectionViewCell *cell = nil; [self.collectionView.visibleCells enumerateObjectsUsingBlock:^(__kindof UICollectionViewCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { UICollectionViewCell *visibleCell = obj; //焦點(diǎn)所在的textField if (visibleCell.textField.isFirstResponder) { cell = visibleCell; } }]; return cell; }
計(jì)算差值改變contentoffset
// 鍵盤監(jiān)聽事件 - (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]) { //鍵盤彈出時 //獲取輸入框焦點(diǎn)所在的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值,鍵盤收起恢復(fù)原來位置時使用 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的值
// 鍵盤監(jiān)聽事件 - (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]) { //鍵盤出現(xiàn)時 } else { //鍵盤收起時 //根據(jù)self.delta復(fù)原 self.collectionView.contentOffset = CGPointMake(0, self.collectionView.contentOffset.y-self.delta); self.delta = 0 } }
關(guān)于iOS中表單列表樣式鍵盤被遮擋如何解決就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。