真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

iOS如何實(shí)現(xiàn)輸入框跟隨鍵盤自動(dòng)上移-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的隨州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

場(chǎng)景還原

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

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

實(shí)現(xiàn)思路

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

具體方案

1. 注冊(cè)兩個(gè)觀察者,觀察鍵盤的彈起與收回

[[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方法中分別實(shí)現(xiàn)輸入框的上移和還原

上移

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

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

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

- (void)keyboardWillShow:(NSNotification *)notification
{
  //獲取處于焦點(diǎn)中的view
  NSArray *textFields = @[phoneNemberText, verifyCodeText];
  UIView *focusView = nil;
  for (UITextField *view in textFields) {
    if ([view isFirstResponder]) {
      focusView = view;
      break;
    }
  }
  if (focusView) {
    //獲取鍵盤彈出的時(shí)間
    double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    //獲取鍵盤上端Y坐標(biāo)
    CGFloat keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
    //獲取輸入框下端相對(duì)于window的Y坐標(biāo)
    CGRect rect = [focusView convertRect:focusView.bounds toView:[[[UIApplication sharedApplication] delegate] window]];
    CGPoint tmp = rect.origin;
    CGFloat inputBoxY = tmp.y + focusView.frame.size.height;
    //計(jì)算二者差值
    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
{
  //獲取鍵盤彈出的時(shí)間
  double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  //還原
  [UIView animateWithDuration:duration animations:^{
    self.view.transform = CGAffineTransformMakeTranslation(0, 0);
  }];
}

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

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

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

- (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;
}

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

- (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;
}

因此我們將之前獲取兩個(gè)Y坐標(biāo)的代碼改用下面的方式:

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

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)標(biāo)題:iOS如何實(shí)現(xiàn)輸入框跟隨鍵盤自動(dòng)上移-創(chuàng)新互聯(lián)
標(biāo)題來源:http://weahome.cn/article/ddhggj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部