scrollRectToVisible UITextField不使用Autolayout滚动

时间:2013-01-03 03:19:50

标签: uiscrollview uitextfield autolayout

[self.scrollView scrollRectToVisible:textField.bounds animated:YES];

我似乎无法让我的UIScrollView完全滚动,因此它不会遮挡我的UITextField。我认为scrollRectToVisible将是我的救世主,但它看起来像是不行。也许我错过了将textField的坐标转换为我的scrollView的内容。无论哪种方式都可以查看我的示例项目。

https://github.com/stevemoser/Programming-iOS-Book-Examples/tree/master/ch20p573scrollViewAutoLayout2

哦,这个项目可能缺少委托连接,但我检查了它,但它仍然没有滚动。

我见过类似的其他问题,但没有提到Autolayout。

2 个答案:

答案 0 :(得分:7)

转换为自动布局后,我遇到了scrollRectToVisible::的问题。我刚刚将其更改为直接调用setContentOffset::,它又开始工作了。

答案 1 :(得分:0)

我遇到了同样的问题,我想将自动浏览的UITextEdit滚动到视图中,而不是第一个响应者。

对我来说,问题是UITextField的边界是在自动布局过程中稍后设置的,所以如果你在设置布局后立即执行它,那么边界就无效了。

为了解决方法,我确实创建了UITextField的后代,覆盖了setBounds:并添加了一个0计时器以滚动到视图"稍后在" (你不能在那一刻滚动,因为那时系统的自动布局传递可能没有完成)

@interface MyTextField: UITextField
{
  bool _scrollIntoView;
}
..
@end
@implementation MyTextField
-(void)setBounds:(CGRect)bounds
{
  bool empty=CGRectIsEmpty(self.bounds);
  bool isFirstResponder=self.isFirstResponder;
  [super setBounds:bounds];
  if (empty && !isFirstResponder && _scrollIntoView) 
    [self performSelector:@selector(scrollIntoViewLater) withObject:nil afterDelay:0];
  else if (empty && isFirstResponder)
    [self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
}

-(void)scrollIntoViewLater
{
  CGRect r=[scrollView convertRect:self.bounds fromView:self];
  [scrollView scrollRectToVisible:r animated:TRUE];
}
@end

如果字段应该可以使用屏幕键盘进行额外编辑,请稍后调用becomeFirstResponder:它使用私有scrollTextFieldToVisible API自动滚动到键盘上方的视图中,而私有scrollRectToVisible:animated: API又调用students[0]滚动视图。

您的示例链接已损坏btw ...