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

时间:2014-09-19 18:11:27

标签: ios uitableview ios8 xcode6

问题

我也试图创建一个自定义搜索文本字段,添加到UITableViewController,始终坚持到页面顶部。 像这样:

enter image description here

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

enter image description here

我发现当我手动设置UITableView的contentInset时,只发生 。 (因此tableview部分标题不会隐藏在搜索视图后面)

我是如何构建的

层:

  • 的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

2 个答案:

答案 0 :(得分:4)

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

·H

@interface CUISearchTableView : UITableView

@end

的.m

#import "CUISearchTableView.h"

@implementation CUISearchTableView

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

@end

答案 1 :(得分:2)

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

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

这是否有意义或我遗失了什么?