iOS之鍵盤彈出視圖上移

有時候搞開發會碰到一個問題,就是當點擊一個UITextField時,彈出虛擬鍵盤會將這個文本控件遮住。這不管從開發角度仍是用戶體驗來講,都是不行的。html

其實要解決這個問題也是很簡單的,只要獲取鍵盤沒彈出前鍵盤的Rect,鍵盤彈出後鍵盤的Rect,其實最主要的變化仍是在於Y值嘛,因此只要二者相減就xcode

能獲得須要移動的距離,而後作個動畫就OK了。post

那具體代碼以下:動畫

  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8.   
  9. - (void)viewDidLoad  
  10. {  
  11.     [super viewDidLoad];  
  12.       
  13.     //註冊觀察鍵盤的變化  
  14.     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(transformView:) name:UIKeyboardWillChangeFrameNotification object:nil];  
  15.       
  16. }  
  17. //鍵盤迴收  
  18. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event  
  19. {  
  20.     for(UIView *view in self.view.subviews)  
  21.     {  
  22.         [view resignFirstResponder];  
  23.     }  
  24. }  
  25.   
  26. //移動UIView  
  27. -(void)transformView:(NSNotification *)aNSNotification  
  28. {  
  29.     //獲取鍵盤彈出前的Rect  
  30.     NSValue *keyBoardBeginBounds=[[aNSNotification userInfo]objectForKey:UIKeyboardFrameBeginUserInfoKey];  
  31.     CGRect beginRect=[keyBoardBeginBounds CGRectValue];  
  32.       
  33.     //獲取鍵盤彈出後的Rect  
  34.     NSValue *keyBoardEndBounds=[[aNSNotification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey];  
  35.     CGRect  endRect=[keyBoardEndBounds CGRectValue];  
  36.       
  37.     //獲取鍵盤位置變化先後縱座標Y的變化值  
  38.     CGFloat deltaY=endRect.origin.y-beginRect.origin.y;  
  39.     NSLog(@"看看這個變化的Y值:%f",deltaY);  
  40.       
  41.     //在0.25s內完成self.view的Frame的變化,等因而給self.view添加一個向上移動deltaY的動畫  
  42.     [UIView animateWithDuration:0.25f animations:^{  
  43.         [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+deltaY, self.view.frame.size.width, self.view.frame.size.height)];  
  44.     }];  
  45. }  
  46. @end  
效果以下:



相關文章
相關標籤/搜索