【发布时间】:2011-11-30 08:42:56
【问题描述】:
我在 UIScrollView 中有一个 UITextField(深几级)。我正在观看 UIKeyboardDidShowNotification,并且当我手动更改第一响应者时也会调用相同的代码(我可能会更改为不同的文本字段而不会暂时隐藏键盘)。在该代码中,我使用scrollRectToVisible:animated: 来确保 UITextField 是可见的。
我非常头疼调试为什么这很有趣,但我现在意识到 UIScrollView 会自动确保第一响应者在其范围内。我正在更改 UIScrollView 的框架,以便它没有隐藏在键盘后面。
但是,我的代码可能比他们的代码更智能,因为我不仅想显示 UITextField,还想显示一些附近的相关视图。如果它们合适,我会尝试展示这些观点;如果不是什么,我会尽可能多地显示它们,但至少要确保 UITextField 是可见的。所以我想保留我的自定义代码。
自动行为干扰了我的代码。我看到的是滚动视图轻轻向上滚动,以便我的内容的底部边缘可见,然后它会向下对齐到我的代码告诉它定位的位置。
有没有办法阻止 UIScrollView 执行其将第一响应者滚动到视图中的默认功能?
更多信息
在查看文档时,我读到他们建议更改滚动视图的 contentInset 而不是框架。我改变了它并消除了一些不可预测的行为,但它并没有解决这个特定的问题。
我认为发布所有代码不一定有用。但这是当时的关键调用和重要属性的值。我只会为 CGRects 编写 4 元组;我的意思是(x,y,宽度,高度)。
[scrollView scrollRectToVisible:(116.2, 71.2, 60, 243) animated:YES];
scrollView.bounds == (0, 12, 320, 361)
scrollView.contentInset == UIEdgeInsetsMake(0, 0, 118, 0)
textField.frame == (112.2, 222.6, 24, 24)
转换为 scrollView 的直接子视图的坐标 == (134.2, 244.6, 24, 24)
转换为scrollView的坐标== (134.2, 244.6, 24, 24)
因此,由于插入,滚动视图底部边缘实际上位于 y == 243。
请求的矩形扩展到 y == 314.2。
文本字段扩展到 y == 268.6。
两者都超出范围。 scrollRectToVisible 正在尝试解决其中一个问题。标准的 UIScrollView / UITextField 行为试图修复另一个。他们没有提出完全相同的解决方案。
【问题讨论】:
-
对于它的价值,我让默认行为适用,它根本不会打扰我。自动滚动的结果与我的代码实现的结果相差不大。
-
目前不确定这是否重要,但我评论了下面的一个很好的解决方案。在键盘显示处理程序中调用您自己的 scrollRectToVisible:animated: 之前的零秒延迟似乎“覆盖”了该行为。
标签: iphone uiscrollview first-responder