scrollRectToVisible UITextField 不使用自动布局滚动
Posted
技术标签:
【中文标题】scrollRectToVisible UITextField 不使用自动布局滚动【英文标题】:scrollRectToVisible UITextField doesn't scroll with Autolayout 【发布时间】:2013-01-03 03:19:49 【问题描述】:[self.scrollView scrollRectToVisible:textField.bounds animated:YES];
我似乎根本无法让我的 UIScrollView 滚动,以免它遮挡我的 UITextField。我认为 scrollRectToVisible 将是我的救星,但看起来不行。也许我错过了将我的 textField 坐标转换为我的滚动视图之类的东西。无论哪种方式,请查看我的示例项目。
https://github.com/stevemoser/Programming-ios-Book-Examples/tree/master/ch20p573scrollViewAutoLayout2
哦,这个项目可能缺少委托连接,但我检查了它仍然没有滚动。
我见过其他类似的问题,但没有提到自动布局。
【问题讨论】:
TPKeyboardAvoidingScrollView 解决了这个问题,但我不想使用整个第三方类来解决它。 我在回答中添加了一个编辑。如果不是这种情况,只需检查这种可能性。 【参考方案1】:我在转换为自动布局后也遇到了scrollRectToVisible::
的问题。我只是将其更改为直接调用setContentOffset::
,然后它又开始工作了。
【讨论】:
【参考方案2】:我遇到了同样的问题,我想将自动布局的 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:
。
顺便说一句,您的示例链接已损坏...
【讨论】:
以上是关于scrollRectToVisible UITextField 不使用自动布局滚动的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 contentInset 时,我不完全理解 scrollRectToVisible
scrollRectToVisible UITextField 不使用自动布局滚动