设置 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
创建了一个子类,当isScrollEnabled
为NO
时,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下拉刷新异常