Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Uitableview iOS 7中嵌入导航栏时出现奇怪的UISearchDisplayController视图偏移行为_Uitableview_Ios7_Interface Builder_Uisearchdisplaycontroller - Fatal编程技术网

Uitableview iOS 7中嵌入导航栏时出现奇怪的UISearchDisplayController视图偏移行为

Uitableview iOS 7中嵌入导航栏时出现奇怪的UISearchDisplayController视图偏移行为,uitableview,ios7,interface-builder,uisearchdisplaycontroller,Uitableview,Ios7,Interface Builder,Uisearchdisplaycontroller,我正在构建一个iOS 7-only应用程序。我正在尝试将UISearchDisplayController设置到导航栏中 我的设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为相对于顶部布局指南的(0,0)。我将约束设置为固定到左侧、顶部和右侧。(我玩过约束,我完全删除了它们,这没关系)除此之外,我还有我的表视图。当我将搜索栏添加到情节提要中的视图时,它会自动为searchDisplayController和searchBar委派设置出口。在代码中,我有s

我正在构建一个iOS 7-only应用程序。我正在尝试将UISearchDisplayController设置到导航栏中

我的设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为相对于顶部布局指南的(0,0)。我将约束设置为固定到左侧、顶部和右侧。(我玩过约束,我完全删除了它们,这没关系)除此之外,我还有我的表视图。当我将搜索栏添加到情节提要中的视图时,它会自动为searchDisplayController和searchBar委派设置出口。在代码中,我有self.searchDisplayController.displaysSearchBarInNavigationBar=YES我有两个问题:

< P > 1)没有任何按钮显示搜索栏(界面生成器>选择搜索栏>选项:没有选择)搜索栏在屏幕中部:

如果单击导航栏,它将开始编辑搜索栏:

还请注意,暗覆盖似乎从导航栏偏移。在我看来,空间与导航栏的高度相同。好像它已经被调低了那么多。另外,当它显示搜索结果时,内容视图的顶部向下移动了相同的量(后面会有更多的图片),这就引出了第二个问题

2) 我把它弄乱了一段时间,决定选中这个选项,让它显示取消按钮。现在,我已将搜索栏正确嵌入导航栏,但覆盖仍向下移动:

同样,当搜索结果表视图出现时,其下移量相同(请注意右侧的滚动条):

更奇怪的是,我在search display controller的tableview层上设置了一个边框,它看起来是正确的:


我以前从未使用过UISearchDisplayController,我不熟悉如何设置它,但在功能上它工作得很好。我读过一些其他类似的帖子,但唯一的建议是通过调整帧和设置手动偏移来修改它。我想知道是什么原因造成的,这是一个bug吗?我做错什么了?如果是bug,我可以等待修复。这似乎是一件很基本的事情,一千个人都做了,没有任何问题,所以我觉得我没有正确地设置它。谢谢你的意见。

我记得我遇到了与你观察到的完全相同的问题。你可以尝试几种解决方案

  • 如果您正在使用故事板 您应该单击为TableView设置的视图控制器或TableView控制器,转到其属性检查器,查看“视图控制器”部分,并将“延伸边”部分设置为位于顶部栏下

  • 如果不使用故事板可以使用viewcontrollers edgesForExtendedLayout属性手动设置设置,这应该可以实现。我用的是故事板


在我的例子中,使用故事板,我必须在顶部栏下检查,在不透明栏下检查,并在底部栏下保持未选中状态。

在我的例子中,我实际上必须取消选中所有扩展边框(基本上与通过编程将扩展边设置为
UIRectEdgeNone
我相信)在我的故事板,以阻止我的搜索栏抵消自己。谢谢你们

不幸的是,上述解决方案都不适用于我,我使用的是
UITableViewController

此链接有助于:

为了方便起见,我将代码放在下面:

static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
    if (!view || classNameSuffix.length == 0) return nil;

    UIView *theView = nil;
    for (__unsafe_unretained UIView *subview in view.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
            return subview;
        }else {
            if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
        }
    }
    return theView;
}

- (void)correctSearchDisplayFrames {
    // Update search bar frame.
    CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
    superviewFrame.origin.y = 0.f;
    self.searchDisplayController.searchBar.superview.frame = superviewFrame;

    // Strech dimming view.
    UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
    if (dimmingView) {
        CGRect dimmingFrame = dimmingView.superview.frame;
        dimmingFrame.origin.y = self.searchDisplayController.searchBar.frame.size.height;
        dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.origin.y;
        dimmingView.superview.frame = dimmingFrame;
    }
}

- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
    [UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
        for (UIView *view in self.tableView.subviews) {
            if (view != self.searchDisplayController.searchResultsTableView &&
                view != self.searchDisplayController.searchBar) {
                view.alpha = hidden ? 0.f : 1.f;
            }
        }
    }];
}

// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
    if (PSPDFIsUIKitFlatMode()) {
        [self.navigationController setNavigationBarHidden:beginSearch animated:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self correctSearchDisplayFrames];
        });
        [self setAllViewsExceptSearchHidden:beginSearch animated:YES];
        [UIView animateWithDuration:0.25f animations:^{
            self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
        }];
    }
}

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:YES];
}

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    [self correctSearchDisplayFrames];
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:NO];
}

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    // HACK: iOS 7 requires a cruel workaround to show the search table view.
    if (PSPDFIsUIKitFlatMode()) {
        controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
    }
}

我也有同样的问题。我通过在tableview下添加view对象来解决这个问题

  • 在情节提要上添加新的ViewController
  • 将TableView拖到新的VC
  • 将表格单元格拖到表格视图中
  • 为TableView数据源建立连接,TableView委托给新VC

  • 我也有过类似的行为。对我来说,解决方案是在父视图控制器的情节提要设置中取消选中“在顶部栏下延伸边”(我已关闭透明导航栏,不确定这是否会产生任何影响)。如果不使用故事板,则必须设置[UIViewController edgesForExtendedLayout]

    从苹果文档:

    此属性仅应用于嵌入到容器中的视图控制器,如UINavigationController或UITabBarController。设置为根视图控制器的视图控制器不会对此属性作出反应。默认值为UIRectEdgeAll


    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
    

    或者参见

    我的问题只是调整滚动视图插入。更改为false后我没有问题

  • 转到情节提要
  • 单击视图控制器
  • 转到ViewController部分下的属性检查器
  • 将“延伸边”部分设置为位于顶部钢筋和不透明钢筋下方
  • 确保在底部钢筋下取消检查

  • 谢谢,成功了。我仍然希望我能弄清楚为什么没有取消按钮搜索栏就不能工作,但这很接近。我没有取消按钮,搜索栏就不能工作,当你没有添加取消按钮时到底发生了什么。真奇怪,最后,我将带有searchdisplay controller的搜索栏从viewcontroller的视图中删除,并将其完全置于视图层次结构之外,从而使其正常工作。我以前从来没有这样做过,但它奏效了。这还增加了一种效果,即在表视图中添加某种自动填充,使其位于导航栏下方。否则,我必须自己添加填充(64px)以偏移导航栏。另外,不要忘记查看ExtendedLayoutCludeSopaqueBars是否适用于您的特定情况。如果导航栏设置为不透明,请勾选