欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移

這篇文章給大家分享的是有關iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)秉承實現(xiàn)全網價值營銷的理念,以專業(yè)定制企業(yè)官網,成都網站制作、網站設計,小程序開發(fā),網頁設計制作,手機網站制作設計營銷型網站幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網+”轉型升級專業(yè)定制企業(yè)官網,公司注重人才、技術和管理,匯聚了一批優(yōu)秀的互聯(lián)網技術人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。

場景還原

有些時候在包含輸入框的頁面中,點擊輸入框輸入會因鍵盤彈起而遮擋住一部分輸入框,影響用戶體驗。iOS在默認情況下并不會處理這種問題,不過我們可以自己實現(xiàn)鍵盤彈起輸入框自動上移的效果。

iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移

實現(xiàn)思路

觀察鍵盤的彈起與收回,當彈起的鍵盤會遮擋住輸入框時,將輸入框跟隨鍵盤一并上移合適的距離,當鍵盤收回時,輸入框回到原始狀態(tài)。

具體方案

1. 注冊兩個觀察者,觀察鍵盤的彈起與收回

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

2. 在上面的keyboardWillShow和keyboardWillHide方法中分別實現(xiàn)輸入框的上移和還原

上移

當彈起的鍵盤遮住了頁面上的輸入框時,我們應該將輸入框移至鍵盤之上,而鍵盤沒有遮到輸入框時,并不需要操作。因此在ios的坐標系下,我們可以分別獲取鍵盤彈起后上端的Y坐標和輸入框下端的Y坐標,通過做差可以判斷出鍵盤是否遮住了輸入框。上移我們可以采用view的transform屬性進行平移變換,而不是直接去操作view的frame,這樣做的好處是當我們要還原view的狀態(tài)時可以直接將transform重置為0,而不需要再關心計算下移時的距離。

還原(下移至原始狀態(tài))

根據前面所說,我們只要在恰當?shù)臅r機操作view的transform屬性就可以實現(xiàn)了。

- (void)keyboardWillShow:(NSNotification *)notification
{
  //獲取處于焦點中的view
  NSArray *textFields = @[phoneNemberText, verifyCodeText];
  UIView *focusView = nil;
  for (UITextField *view in textFields) {
    if ([view isFirstResponder]) {
      focusView = view;
      break;
    }
  }
  if (focusView) {
    //獲取鍵盤彈出的時間
    double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    //獲取鍵盤上端Y坐標
    CGFloat keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
    //獲取輸入框下端相對于window的Y坐標
    CGRect rect = [focusView convertRect:focusView.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
    CGPoint tmp = rect.origin;
    CGFloat inputBoxY = tmp.y + focusView.frame.size.height;
    //計算二者差值
    CGFloat ty = keyboardY - inputBoxY;
    NSLog(@"position keyboard: %f, inputbox: %f, ty: %f", keyboardY, inputBoxY, ty);
    //差值小于0,做平移變換
    [UIView animateWithDuration:duration animations:^{
      if (ty < 0) {
        self.view.transform = CGAffineTransformMakeTranslation(0, ty);
      }
    }];
  }
}

- (void)keyboardWillHide:(NSNotification *)notification
{
  //獲取鍵盤彈出的時間
  double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  //還原
  [UIView animateWithDuration:duration animations:^{
    self.view.transform = CGAffineTransformMakeTranslation(0, 0);
  }];
}

看上去這樣已經完美實現(xiàn)了輸入框隨鍵盤自動上移,我們也可以喝杯茶稍微休息一下了。沒錯,在iOS 8及之后的系統(tǒng)中,確實可以正常的工作,然而如果你的應用需要適配iOS 7并且要支持橫屏,那么上面的方式在iOS7上,并不能按照我們的期望正確移動。

原因:在ios7上,鍵盤的frame,系統(tǒng)是按照豎屏狀態(tài)下window坐標系來計算的,并不考慮旋轉的因素,因此在橫屏下得到的鍵盤frame是錯誤的。受此影響的還有橫屏時獲取屏幕寬高[UIScreen mainScreen].bounds,也會有這樣的問題。這種情況我們不僅無法正確得到鍵盤的frame,而且輸入框相對于window的坐標計算結果也是錯誤的。

因此在ios7上,鍵盤上端的Y坐標以及輸入框下端相對于window的Y坐標需要單獨處理。鍵盤上端的Y坐標可以通過屏幕高度減鍵盤高度得到。我們通過下面的方法獲取鍵盤上端的Y坐標。

- (CGFloat)getKeyboardY:(NSDictionary *)userInfo
{
  CGFloat screenHeight;
  CGFloat keyboardY = 0;
  CGFloat keyboardHeight = 0;
  UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (( [[[UIDevice currentDevice] systemVersion] floatValue]<8) && UIInterfaceOrientationIsLandscape(orientation))
  {
    screenHeight = [[UIScreen mainScreen] bounds].size.width;
    keyboardHeight = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.width;
    keyboardY = screenHeight - keyboardHeight;
  }
  else if (( [[[UIDevice currentDevice] systemVersion] floatValue]<8) && UIInterfaceOrientationIsPortrait(orientation)) {
    screenHeight = [[UIScreen mainScreen] bounds].size.height;
    keyboardHeight = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    keyboardY = screenHeight - keyboardHeight;
  }
  else {
    keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
  }
  return keyboardY;
}

輸入框下端相對于window的坐標如何計算呢?我們首先獲得的其實是基于豎屏狀態(tài)下坐標系中的Y值,而我們期望的是橫屏下得到橫屏狀態(tài)下坐標系中的Y值,根據兩個坐標系的關系,可以將第一次轉換得到的坐標再做一次轉換,計算得出橫屏坐標系下的Y坐標值。我們通過下面的方法獲取輸入框下端的Y坐標。

- (CGPoint)getViewOriginPointToWindow:(UIView *)view
{
  CGPoint origin;
  if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8) {
    CGPoint focusViewPoint = [view convertPoint:CGPointZero toView:nil];
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == UIInterfaceOrientationLandscapeLeft) {
      origin.y = focusViewPoint.x;
      origin.x = [[[UIApplication sharedApplication] delegate] window].bounds.size.height - focusViewPoint.y;
    }
    else if (orientation == UIInterfaceOrientationLandscapeRight) {
      origin.y = [[[UIApplication sharedApplication] delegate] window].bounds.size.width - focusViewPoint.x;
      origin.x = focusViewPoint.y;
    }
    else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
      origin.y = [[[UIApplication sharedApplication] delegate] window].bounds.size.height - focusViewPoint.y;
      origin.x = [[[UIApplication sharedApplication] delegate] window].bounds.size.width - focusViewPoint.x;
    }
    else {
      origin = focusViewPoint;
    }
  }
  else {
    CGRect rect = [view convertRect:view.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
    origin = rect.origin;
  }
  return origin;
}

因此我們將之前獲取兩個Y坐標的代碼改用下面的方式:

//獲取鍵盤上端Y坐標
CGFloat keyboardY = [self getKeyboardY:notification.userInfo];
//獲取輸入框下端相對于window的Y坐標
CGPoint tmp = [self getViewOriginPointToWindow:focusView];
CGFloat inputBoxY = tmp.y + focusView.frame.size.height;

這樣就完美實現(xiàn)了輸入框隨鍵盤自動上移的效果。

iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移

感謝各位的閱讀!關于“iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網站欄目:iOS如何實現(xiàn)輸入框跟隨鍵盤自動上移
網頁URL:http://aaarwkj.com/article30/gjdjpo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站導航、網站排名做網站、Google、云服務器、電子商務

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站建設網站維護公司
婷婷久久香蕉五综合加勒比| 久久久国产精品视频网站| 欧美一区二区三区爽| 午夜亚洲欧美日韩在线| 国产自拍成人精品视频| 亚洲成av人在线播放| 97人妻人人揉人人澡人人学生| 99久久免费精品老色| 亚洲国产欧美日韩在线不卡成人 | 亚洲视频精品一区二区三区| 97精品在线视频免费| 亚洲国产欧美在线91| 97久久久人妻精品一区| 日韩国产推荐一区二区| 国产传媒网站在线观看| 中国日本欧美最黄大片| 午夜体内射精免费视频| 有码国内精品人妻少妇| 欧美日本一区二区三区免费| 日韩av一区三区在线| 在线免费观看91亚洲| 中文字幕三级电影天堂| 麻豆午夜视频免费在线观看| 五月婷婷丁香六月在线综合| 免费在线观看性生活视频| 欧美日韩亚洲视频二区 | 91精品国产高清91久久久久久| 深夜成人免费观看视频| 双高干文男女主都很强| 亚洲一区二区三区熟妇| 国产一级夫妻性生活欧美| 日韩在线国产精品一区| 国产中文字幕婷婷丁香| 亚洲日本高清一二三区| 91九色蝌蚪国产欧美亚洲| 日韩二区三区在线视频| 欧美日韩国产精品久久乐播| 欧美日韩在线国产一区| 欧美日韩在线高清一区二区| 精品国产亚洲av剧情| 亚洲熟妇丰满多毛的大昊|