最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實現(xiàn)輸入框跟隨鍵盤自動上移的實例代碼

 更新時間:2017年04月14日 09:21:23   作者:凝望向北  
本篇文章主要介紹了iOS實現(xiàn)輸入框跟隨鍵盤自動上移的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

場景還原

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


實現(xiàn)思路

觀察鍵盤的彈起與收回,當(dāng)彈起的鍵盤會遮擋住輸入框時,將輸入框跟隨鍵盤一并上移合適的距離,當(dāng)鍵盤收回時,輸入框回到原始狀態(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)輸入框的上移和還原

上移

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

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

根據(jù)前面所說,我們只要在恰當(dāng)?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坐標(biāo)
    CGFloat keyboardY = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
    //獲取輸入框下端相對于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;
    //計算二者差值
    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);
  }];
}

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

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

因此在ios7上,鍵盤上端的Y坐標(biāo)以及輸入框下端相對于window的Y坐標(biāo)需要單獨處理。鍵盤上端的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;
}

輸入框下端相對于window的坐標(biāo)如何計算呢?我們首先獲得的其實是基于豎屏狀態(tài)下坐標(biāo)系中的Y值,而我們期望的是橫屏下得到橫屏狀態(tài)下坐標(biāo)系中的Y值,根據(jù)兩個坐標(biāo)系的關(guān)系,可以將第一次轉(zhuǎn)換得到的坐標(biāo)再做一次轉(zhuǎn)換,計算得出橫屏坐標(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;
}

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS常用小功能(獲得屏幕圖像、壓縮圖片、加邊框、調(diào)整label的size)

    iOS常用小功能(獲得屏幕圖像、壓縮圖片、加邊框、調(diào)整label的size)

    本文主要介紹了iOS常用小功能:獲得屏幕圖像,label的動態(tài)size,時間戳轉(zhuǎn)化為時間,RGB轉(zhuǎn)化成顏色,加邊框,壓縮圖片,textfield的placeholder,圖片做灰度處理的方法。下面跟著小編一起來看下吧
    2017-03-03
  • iOS開發(fā)基礎(chǔ)之C語言

    iOS開發(fā)基礎(chǔ)之C語言

    現(xiàn)在越來越多的iOS開發(fā)興趣愛好者投入到了iOS培訓(xùn)中,有的是已經(jīng)在職的員工,有的是還在就讀的學(xué)生,還有一些是完全零基礎(chǔ)的同學(xué),那么對于他們來說就要一切從基礎(chǔ)開始學(xué),首先從C語言學(xué)起
    2015-11-11
  • iOS中最全的各種定時器使用教程

    iOS中最全的各種定時器使用教程

    這篇文章主要給大家介紹了關(guān)于iOS中最全的各種定時器的使用教程,文中通過示例代碼介紹的非常詳細(xì),通過文中介紹的最全的定時器相信會對各位iOS開發(fā)者們帶來一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • iOS如何獲取手機的Mac地址

    iOS如何獲取手機的Mac地址

    這篇文章主要為大家詳細(xì)介紹了iOS獲取手機的Mac地址的多種方法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 在iOS App中實現(xiàn)地理位置定位的基本方法解析

    在iOS App中實現(xiàn)地理位置定位的基本方法解析

    這篇文章主要介紹了在iOS App中實現(xiàn)地理位置定位的基本方法解析,包括獲取當(dāng)前位置和計算兩點間距離等基本功能的實現(xiàn),需要的朋友可以參考下
    2016-05-05
  • iOS實現(xiàn)單元格折疊

    iOS實現(xiàn)單元格折疊

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)單元格折疊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS中的類、元類以及isa示例詳解

    iOS中的類、元類以及isa示例詳解

    從初學(xué)OC的時候就聽人提起過OC對象中的isa指針,用來指向?qū)ο笏鶎俚念?,從而可以在調(diào)用方法時通過isa指針找到相應(yīng)的方法和屬性,下面這篇文章主要給大家介紹了關(guān)于iOS中類、元類以及isa的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • iOS中NSNumberFormatter的介紹與用法

    iOS中NSNumberFormatter的介紹與用法

    NSNumberFormatter 應(yīng)該可以滿足你對數(shù)據(jù)形式的一般需求,值得了解一下,下面這篇文章主要給大家介紹了關(guān)于iOS中NSNumberFormatter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 詳解iOS 裁剪圓形圖像并顯示(類似于微信頭像)

    詳解iOS 裁剪圓形圖像并顯示(類似于微信頭像)

    本篇文章主要介紹了iOS 裁剪圓形圖像并顯示(類似于微信頭像),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • iOS開發(fā)中UIImageView控件的常用操作整理

    iOS開發(fā)中UIImageView控件的常用操作整理

    這篇文章主要介紹了iOS開發(fā)中UIImageView控件的常用操作整理,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-01-01

最新評論

夏津县| 驻马店市| 汉寿县| 定南县| 阳原县| 乌兰浩特市| 新竹县| 稻城县| 桓台县| 潼南县| 盐亭县| 蒙自县| 三河市| 探索| 收藏| 米林县| 开阳县| 甘孜县| 钟山县| 林甸县| 裕民县| 万源市| 浮山县| 兰州市| 浏阳市| 青龙| 浪卡子县| 土默特右旗| 临漳县| 永兴县| 乌鲁木齐县| 华蓥市| 平舆县| 玛沁县| 永济市| 林口县| 东至县| 利津县| 闵行区| 大冶市| 卢龙县|