设置 contentInset 并且 tableViewHeader 中的 UITextField 变为活动状态时 UITableView 向下滚动

Posted

技术标签:

【中文标题】设置 contentInset 并且 tableViewHeader 中的 UITextField 变为活动状态时 UITableView 向下滚动【英文标题】:UITableView scrolls down when contentInset is set and UITextField in tableViewHeader becomes active 【发布时间】:2014-09-19 18:11:27 【问题描述】:

问题

我也在尝试制作一个 custom 搜索文本字段,添加到 UITableViewController,始终保持在页面顶部。 像这样:

一切正常,但是当我点击搜索文本字段成为FirstResponder 时,tableView 奇怪地向下滚动。

我发现这种情况只有在我手动设置 UITableView 的 contentInset 时发生。 (这样 tableview 部分标题就不会隐藏在搜索视图后面)

我是如何构建它的

图层:

表格视图 UIView(作为 UITableView.tableViewHeaderView) UIView(当用户滚动 tableView 时更新框架) UITextField(用于搜索输入)

用户滚动时修复搜索视图框架的代码:

var rect = frame
rect.origin.y = scrollView.contentOffset.y + 64
frame = rect

我可能做的一切都很愚蠢,但我想让视图保持在顶部,因为用户会比其他应用更多地使用搜索。有什么想法吗?

我的应用需要 ios 8,因此我无法在 iOS 7 上进行测试。如果有帮助,我可以进行屏幕录制。

更新 我创建了一个示例项目,其中包含我在主项目中使用的相同对象。 https://www.dropbox.com/s/qdlx0milebbuf3p/Search%20bug%20Example.zip?dl=0

【问题讨论】:

只是一个疑问,如果您不想滚动,为什么要在tableView中添加searchBar? 我需要使用 UITableViewController 来获得额外的功能,比如 UIRefreshControl 等等。 【参考方案1】:

这是一个 UIKit 错误。为了解决这个问题,我为UITableView 创建了一个子类,当isScrollEnabledNO 时,NEVER 更改内容偏移量。

.h

@interface CUISearchTableView : UITableView

@end

.m

#import "CUISearchTableView.h"

@implementation CUISearchTableView

- (void)setContentOffset:(CGPoint)contentOffset 
    if (self.isScrollEnabled) 
        [super setContentOffset:contentOffset];
    


@end

【讨论】:

【参考方案2】:

我不确定您是否需要执行所有这些操作。如果您只是使用 UIViewController 并向其中添加 UITableView,那么您可以将 UISearchView 放置在任何地方(即视图的顶部)。您只需要确保 UISearchView 是最顶层的视图(将子视图放在前面)。

我知道您正在使用 UITableViewController,但如果您想使用自己的搜索视图而不是 TableViewController+Search,那么这是您最好的选择。唯一需要的是添加顶部内容偏移量(您已经在做)。然后你可以删除 CUISearchTableView。

这有意义还是我错过了什么?

【讨论】:

以上是关于设置 contentInset 并且 tableViewHeader 中的 UITextField 变为活动状态时 UITableView 向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

设置 WKWebView scrollView 的 contentInset 导致页面跳转到顶部

为 keyboardWillShowNotification 设置 UIScrollView 的 contentInset 不能正常工作

当键盘出现时,我应该如何正确设置 UITextView 的 contentInset

设置contentInset时MJRefresh下拉刷新异常

WKWebView+contentInset 使内容大小错误

iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画