如何以编程方式将UIScrollView移动到焦点在键盘上方的控件中?

mam*_*mcx 50 iphone user-interface objective-c

我有6个UITextFields在我的UIScrollView.现在,我可以按用户请求滚动.但是当键盘出现时,会隐藏一些文本字段.

这不是用户友好的.

如何以编程方式滚动视图,以确保键盘不隐藏文本字段?

jam*_*ack 77

这对我有用.在为键盘调整视图之前,有一个实例变量保存UIScrollView的偏移值,这样您就可以在UITextField返回之后恢复之前的状态:

//header
@interface TheViewController : UIViewController <UITextFieldDelegate> {
    CGPoint svos;
}


//implementation
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    svos = scrollView.contentOffset;
    CGPoint pt;
    CGRect rc = [textField bounds];
    rc = [textField convertRect:rc toView:scrollView];
    pt = rc.origin;
    pt.x = 0;
    pt.y -= 60;
    [scrollView setContentOffset:pt animated:YES];           
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [scrollView setContentOffset:svos animated:YES]; 
    [textField resignFirstResponder];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小小的补充:放svos = scrollView.contentOffset; 在ViewDidLoad方法中,如果您有多个UITextFields.因为如果你从一个文本字段转到另一个文本字段而不隐藏键盘svos将被覆盖,因此恢复内容偏移将失败. (2认同)

mam*_*mcx 38

最后,一个简单的修复:

UIScrollView* v = (UIScrollView*) self.view ;
CGRect rc = [textField bounds];
rc = [textField convertRect:rc toView:v];
rc.origin.x = 0 ;
rc.origin.y -= 60 ;

rc.size.height = 400;
[self.scroll scrollRectToVisible:rc animated:YES];
Run Code Online (Sandbox Code Playgroud)

现在我认为只是将它与上面的链接结合起来并设置好了!


Mic*_*son 22

我已经整理了一个通用的,插入式UIScrollView和UITableView子类,它负责将其中的所有文本字段移出键盘.

当键盘即将出现时,子类将找到即将被编辑的子视图,并调整其帧和内容偏移以确保视图可见,并使用与键盘弹出窗口匹配的动画.当键盘消失时,它会恢复其先前的大小.

它应该基本上适用于任何设置,可以是基于UITableView的界面,也可以是手动放置的视图.

在这里.


(For google: TPKeyboardAvoiding, TPKeyboardAvoidingScrollView, TPKeyboardAvoidingCollectionView.)
Editor's note: TPKeyboardAvoiding seems to be continually updated and fresh, as of 2014.
Run Code Online (Sandbox Code Playgroud)