ios - 带有 contentInset 的 UIScrollView 打破了 UISearchBar "autofocus"

标签 ios uiscrollview

我在 UIScrollView 中有一个 UISearchBar(好吧,准确地说是一个 AQGridView)。现在搜索栏最初应该是隐藏的(例如你在音乐应用程序中看到的)。由于 UIScrollViews 没有标题 View ,我将它放在 UIScrollView 框架之外的 -40 点,并将 contentInset 设置为 40 点。

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.f, -40.f, 320.f, 40.f)];
gridView.contentInset = UIEdgeInsetsMake(0.f, 40.f, 0.f, 0.f);

现在从外观和一般行为来看,它几乎完全符合我的要求。搜索栏是隐藏的,但我可以向上滚动以显示它。

现在是这样的:

当我触摸 searchBar 使其获得焦点并输入一些文本时,一切正常除了当 searchBar 不完全可见时。在这种情况下,UIScrollView 会尝试自动滚动它以使其完全可见。但是,它会向错误的方向滚动。

因此,当隐藏搜索栏顶部的 10 个点时, ScrollView 会向下而不是向上滚动。

这可能是一个有点模糊的问题,但也许有人可以在这里告诉我错误......我在这里能找到的唯一线程是这个:uitableview contentInset issue但这似乎也对我的情况没有帮助。

最佳答案

我遇到了几乎相同的问题,而 CodaFi 的解决方案无法解决我的问题。 所以我有点怀疑这个解决方案是否是正确答案。

以下是我的情况和问题的描述: 我想将 UINavigationBar 添加到 ContentInset 区域中,将 UIWebView 添加到 UIScrollView 的 ContentSize 区域中,以便 UINavigationBar 可以在向下滚动时与屏幕顶部之外的 Web 内容一起消失。在 UINavigationBar 中,我添加了一个 UITextField 和一个 UISearchBar(是的,就像 Safari 一样)。以下设置代码部分(在 viewDidLoad: 方法中):

navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, -64, 320, 64);
textfield = [[UITextField alloc] initWithFrame:CGRectMake(5, 23, 150, 30)];
[navigationBar addSubview:textfield];
searchbar = [[UISearchBar alloc] initWithFrame:CGRectMake(200, 23, 100, 30)];
[navigationBar addSubview:searchbar];
[self.webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];
[self.webView.scrollView addSubview:navigationBar];

问题是,当我单击文本字段或搜索栏时,导航栏(实际上是整个 View )在屏幕中下降:文本字段下降 41 点,搜索栏下降 42 点(很奇怪!)。所以它在屏幕上方留下了从 0 到 41(或 42)点的整个神秘空白。另一件奇怪的事情是它只发生一次!在我用手指滚动屏幕后,当我点击文本字段或搜索栏时,它消失了,再也不会出现了。 我相信我的问题的本质就像丹尼斯的一样。

在网上找了两天,很遗憾,我没有找到解决这个问题本质的完美解决方案(实际上我什至不太确定问题的本质......)。

但根据我的实验和观察,我的假设是文本字段向下移动的 41 个点可能是因为它在导航栏上设置的相对位置 (-64 + 23 = -41)。当它被用户点击时,系统(iOS)检查了它的位置(虽然我已经在 viewDidLoad 中将 contentOffset 设置为 -64 :) 并发现它不在用户范围内并强制 ScrollView 向下滚动直到它出现了(41 点向下)。 如果我们(开发人员)设置内容插入区域并与之交互,我无法理解 ScrollView 的行为。谈论它的文档和引用文献真的很少。我希望我的假设是错误的,并且将来有人可以纠正我并帮助我们找到真相。

最后,虽然我找不到“真正”的答案,但实际上我找到了解决这个问题的办法(就像治标不治本)。这是代码:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < -64) {    // if it is beyond the contentInset area
        if (!scrollView.dragging && !scrollView.decelerating) {    // scrollView is operated by system
            [scrollView setContentOffset:CGPointMake(0, -64) animated:NO];  // freeze the screen at (0, -64) position
        }
    }
}

关于ios - 带有 contentInset 的 UIScrollView 打破了 UISearchBar "autofocus",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10730431/

相关文章:

ios - 如何将 UIImage 从 Swift 上传到 Flask 服务器?

ios - Swift - ScrollView 小于主视图

ios - 随键盘移动的 View

ios - 当没有 ScrollView 正在减速时,UIScrollView isDragging 返回 YES

ios - SwiftUI Firebase - 在 Firebase 中加减整数

ios - 如何将设备 token 从 NSData 更改为 NSString

objective-c - 在应用程序中启用和禁用多任务处理

ios - ARM7和ARM7s有什么区别

iphone - 当我们在 iphone 中输入文本时,如何显示 UItextfield 的键盘上侧?

iphone - UIScrollView block 运行循环?