【问题标题】:Locking a UISearchBar to the top of a UITableView将 UISearchBar 锁定到 UITableView 的顶部
【发布时间】:2012-11-01 10:49:36
【问题描述】:

我想得到这样的行为: 我有一个 UISearchBar,它是我的表视图的表头视图。滚动表格时,搜索栏确实会移动,但如果您在表格边界上方滚动,搜索栏将永远不会停止接触导航栏。

我在这里找到了一个很好的答案 - Locking a UISearchBar to the top of a UITableView like Game Center 但它不适用于 iOS 6 - 使用表格视图标题框架的操作不起作用

这可能是什么原因?

【问题讨论】:

    标签: ios uitableview ios6 uisearchbar tableheader


    【解决方案1】:

    我找到了一个适用于 iOS 6 及更低版本的解决方案

    创建 UITableView 的子类并覆盖 layoutSubviews 方法

    - (void)layoutSubviews
    {
        [super layoutSubviews];
        CGRect rect = self.tableHeaderView.frame;
        rect.origin.y = MIN(0, self.contentOffset.y);
        self.tableHeaderView.frame = rect;
    }
    

    【讨论】:

    • 非常感谢!替换 scrollViewDidScroll 中的栏没有用,但这成功了:)
    【解决方案2】:

    如果您使用以下内容:

    [_tableView setTableHeaderView:_searchBar];
    

    当您将表格视图滚动到第一行之外时,搜索栏也应该消失而不是停留在视图顶部。

    没有看到您的代码,我只能假设您可能已将 UISearchBar 添加为节标题而不是表标题?

    【讨论】:

    • 谢谢,但这并不是我想要的。我也使用 setTableHeaderView 方法,但我想稍微改变一下 TableHeaderView 的行为(我在 iOS 5.x 上做过) - 正如你所说,它应该滚动所有表格内容(这是默认行为),但应该保持在顶部如果您在边界上方滚动。 i.stack.imgur.com/w2sVr.jpg - 这张图片解释得更好(我想要和游戏中心一样)
    【解决方案3】:

    那是因为iOS6 sdk在滚动时没有更新,也许同样优化。所以滚动时需要调用tableview layoutSubviews。

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView 
    {
        UISearchBar *searchBar = searchDisplayController.searchBar;
        CGRect rect = searchBar.frame;
        rect.origin.y = MIN(0, scrollView.contentOffset.y);
        [scrollView layoutSubviews];
        searchBar.frame = rect;
    }
    

    【讨论】:

    • 我遇到了同样的问题。我在 iOS5 中使用过类似的代码(没有 layoutSubviews),效果很好,但在 iOS6 中却不行。添加 layoutSubviews 代码解决了这个问题。
    • 这样做似乎会导致搜索栏失去其触摸事件。相反,被覆盖的 tableview 单元格被调用。有人看到这个吗?
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多