由UISearchController在表头视图中呈现的UISearchBar在活动时动画太远

时间:2015-02-04 16:20:53

标签: ios uitableview ios8 uisearchbar uisearchcontroller

我正在使用UISearchController在tableview的标题视图中显示一个搜索栏:

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(其中设置tableHeaderView属性两次是必要的,否则标题视图与第一行重叠,c.f。a couple of answers on S.O.

这是它看起来的样子,在不活动时完美地处于适当位置: Inactive search bar in correct position

搜索栏应该在活动时保持原位 - 我不希望它向上移动以隐藏导航栏。但它意外地动画,在它和导航栏之间留下一个空白区域:

Screenshot showing search bar animated too far down

这是一个 video of weird search bar animation

如果我只是使用与UISearchController分开的搜索栏,则它在激活时不会显示相同的行为。

在我的呈现视图控制器中,我有self.definesPresentationContext = YES;self.navigationController.navigationBar.translucent = YES;,而在IB中没有"扩展边缘"盒子是活跃的(所有这些似乎都是可能的东西,可能会引起搜索演示,阅读周围)。

有谁知道如何阻止搜索栏动画下来?

14 个答案:

答案 0 :(得分:64)

旧问题,但我能够通过设置

来解决这个问题

self.extendedLayoutIncludesOpaqueBars = YES;

在我的视图控制器上。我认为问题是由于有一个不透明的导航栏,但在搜索控制器上将hidesNavigationBarDuringPresentation设置为NO,导致搜索栏在聚焦时错误地定位。

答案 1 :(得分:28)

好的,所以我终于找到了自己的解决方案。虽然我们的代码/故事板中很可能还有其他东西(这就是为什么这是一个难以回答的问题),但大部分时间我都遵循了Apple关于UISearchController的教程:(https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html

几乎我的所有代码都与他们的代码完全相同,但是我无法让搜索栏在点击内部时不跳转。所以我所做的就是在故事板中检查原始表视图和搜索结果表视图中的“不透明条形图”。这让搜索栏停止跳跃。

但最后一个问题是,搜索栏隐藏了结果表视图的第一行。为了解决这个问题,我将self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);添加到了结果表视图的viewDidLoad方法中。瞧!

答案 2 :(得分:28)

我可以通过从ViewController中删除以下行来阻止UISearchBar向下移动: self.definesPresentationContext = YES;

答案 3 :(得分:21)

definesPresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar

        definesPresentationContext = true

答案 4 :(得分:16)

轮到我了。当我遵循WWDC示例代码时,我也遇到了这个问题。

我注意到如果我没有设置searchBar的scopeButtonTitles属性,则searchBar将不可见。经过仔细检查,它只有一个CGRectZero框架。这意味着设置scopeButtonTitles会在幕后设置框架。因此,如果不想显示任何scopeButtonTitles,但仍希望不必将UISearchBar硬编码到特定高度,请将scopeButtonTitles设置为空数组。

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar

将scopeButtonTitles设置为1个字符串的数组不会显示范围按钮标题,但仍然具有处理视图的逻辑,实质上是搞乱了布局。

支持Apple的QA团队(适用于iOS 8)

答案 5 :(得分:6)

发现它!这似乎是呈现vc的viewDidLoad中的攻击线:

self.edgesForExtendedLayout = UIRectEdgeNone;

删除了该搜索栏并按预期保留在原位。

答案 6 :(得分:4)

取消选中调整滚动视图插播

检查在顶栏下

已修复我的问题enter image description here

答案 7 :(得分:2)

适用于iOS 11& swift 4,在viewController中设置线波纹管解决了我的问题(searchBar跳下来):

self.edgesForExtendedLayout = .bottom

答案 8 :(得分:1)

我猜你设置了UISearchBar frame.original.y = 64

有代码

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

searchBar.frame = CGRectMake(0, 0, 376, 44);

洗可以帮到你

答案 9 :(得分:0)

在我的情况下,将导航栏设置为self.navigationController.navigationBar.translucent = NO;可解决问题。在布局搜索栏时,搜索栏显示层似乎没有考虑导航栏的半透明度。

我意识到这不是一个完美的解决方案,因为导航栏的半透明可以在其他地方抛弃布局,但它至少解决了在非半透明导航条可能的情况下的问题。

答案 10 :(得分:0)

如第一篇文章所述,每个人都需要一个不同的解决方案。所以这是我的。我必须结合本页提到的两件事,即:

斯威夫特2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None

答案 11 :(得分:0)

非常简单,只需要添加了女巫搜索栏中的表格视图标题视图的clipsToBounds = true。

countryTableView.tableHeaderView?.clipsToBounds = true

答案 12 :(得分:0)

如果您使用TabBarself.extendedLayoutIncludesOpaqueBars = true ,则无法使用

import { Component } from '@angular/core';
import { FileUploader } from 'ng2-file-upload';

const URL = 'http://localhost:4200/src/app/uploads/';

@Component({
  selector: 'upload-file',
  templateUrl: 'upload-file.html'
})
export class UploadCvComponent {
  uploader: FileUploader = new FileUploader({ url: URL });
  hasBaseDropZoneOver: boolean = false;
  hasAnotherDropZoneOver: boolean = false;

  fileOverBase(e: any): void {
    this.hasBaseDropZoneOver = e;
  }

  fileOverAnother(e: any): void {
    this.hasAnotherDropZoneOver = e;
  }
}

您需要此解决方案:https://stackoverflow.com/a/46151063/3369381

答案 13 :(得分:0)

我的是主控制器.xib文件中元素的顺序。

这行得通。

This worked

这行不通。

enter image description here