몇몇 상황에서 iOS 개발이 안드로이드보다 불편할 때가 있는데, 그 중에 하나가 입력란이 키보드에 가려질 때이다.
안드로이드는 시스템에서 알아서 처리해주는데, iOS는 일일이 바꿔줘야한다.
찾아보니 애플에서 제공해주는 소스가 있는데, 동작을 안한다 -_-
어차피 나중되면 또 잊어비릴거니까 블로그에 올려놔야한다.
먼저 SingleView 프로젝트를 만든다.
ViewController의 메인뷰를 ScrollView로 바꾸고, 아래에 UIView를 넣고, UITextField를 넣는다.
실행하면 9까지는 커서가 보이지만, 10부터는 입력란이 보이지가 않는다.
일단 UITextFieldDelegate를 추가해주고,
@interface ViewController () <UITextFieldDelegate>
UITextField의 Delegate를 ViewController로 지정해준다.
키보드가 표시될 때/숨겨질 때를 받아오고, 뷰가 닫힐 때 해제한다.
-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self registNotification]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self unregistNotification]; } -(void) registNotification { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } -(void) unregistNotification { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; }
입력란에 커서가 표시되면 현재 입력 중인 UITextField를 저장해놓고, activeField가 키보드에 가려진다면 스크롤을 이동시킨다.
-(void)textFieldDidBeginEditing:(UITextField *)textField { self.activeField = textField; self.activeField.delegate = self; } -(void)textFieldDidEndEditing:(UITextField *)textField { self.activeField = nil; } - (void)keyboardWasShown:(NSNotification*)aNotification { NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); self.scrollView.contentInset = contentInsets; self.scrollView.scrollIndicatorInsets = contentInsets; CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; if (!CGRectContainsPoint(aRect, self.activeField.frame.origin) ) { [self.scrollView setContentSize:CGSizeMake(CGRectGetWidth(self.scrollView.frame), CGRectGetHeight(self.scrollView.frame) + kbSize.height)]; [self.scrollView scrollRectToVisible:self.activeField.frame animated:YES]; } } - (void)keyboardWillBeHidden:(NSNotification*)aNotification { [self.scrollView setContentOffset:CGPointZero animated:YES]; }
그럼 이렇게 13번도 잘 표시가 된다.
그럼 이제 빈 곳을 터치하면 커서를 빼는 동작을 넣어야한다.
Tap Gesture Recognizer를 추가하고, scrollView와 연결시켜준다.
Tap Gesture의 selector를 연결시켜주고,
- (IBAction)resignOnTap:(id)sender { [self.activeField resignFirstResponder]; }
resignFirstResponder 를 호출시켜주면 된다.
Full Source : https://github.com/susemi99/KeyboardManagingForUITextField