use*_*346 4 keyboard objective-c uitextfield ios
我有多个文本字段,当我专注于文本框时,它将自动向上滚动,键盘将隐藏文本框。
知道如何在单击时将文本字段滚动到焦点字段吗?
- (void)registerForKeyboardNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
activeField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
activeField = nil;
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
}
- (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);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
[scrollView setContentOffset:scrollPoint animated:YES];
}
}
Run Code Online (Sandbox Code Playgroud)
我认为您发布的代码段是Apple文档中的代码段,该代码段假定基本视图层次结构中的UIScrollView(或其子类之一,如UITableView)填充了整个屏幕。如果视图布局更复杂,或者需要支持多种方向,则文本字段将不会滚动到可见状态,因为矩形计算将是错误的。您需要稍微调整一下代码,我的建议是您以这种方式解决问题:
滚动视图的新contentInsent高度应等于键盘和滚动视图之间的交点矩形的高度。
在代码中:
- (void)keyboardWasShown:(NSNotification*)aNotification
{
CGRect kbRawRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect scrollViewFrame = [self.scrollView.window convertRect:self.scrollView.frame fromView:self.scrollView.superview];
// Calculate the area that is covered by the keyboard
CGRect coveredFrame = CGRectIntersection(scrollViewFrame, kbRawRect);
// Convert again to window coordinates to take rotations into account
coveredFrame = [self.scrollView.window convertRect:self.scrollView.frame fromView:self.scrollView.superview];
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, coveredFrame.size.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
CGRect activeFieldRect = [self.activeField convertRect:self.activeField.bounds toView:self.scrollView];
[self.scrollView scrollRectToVisible:activeFieldRect animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
注意,我已经使用了方便的UIScrollView的scrollRectToVisible函数来尽可能地抽象最终的滚动操作。
归档时间: |
|
查看次数: |
4486 次 |
最近记录: |