【问题标题】:iOS 7 UISearchDisplayController search bar overlaps status bar while searchingiOS 7 UISearchDisplayController 搜索栏在搜索时与状态栏重叠
【发布时间】:2013-09-26 09:08:18
【问题描述】:

我正在为 iOS 7 更新我的应用,并且我正在调整我的所有视图以适应新的透明状态栏(我的应用仍将使用不透明的导航栏)。

在每个视图中调整状态栏相对容易,除了我在一个视图控制器中将 UISearchBar 连接到 UISearchDisplayController 时遇到的一个主要问题。

搜索栏似乎正常显示,如下图:

问题是,一旦我开始搜索,导航栏就会消失(应该如此),但其他所有内容也会向上移动以与状态栏重叠:

这似乎没有按预期工作,因为屏幕变暗发生在搜索栏下方 20 像素处,搜索栏应该结束的地方。

iOS 7 中是否有内置解决方案?我宁愿不必在每次用户开始和结束搜索时手动调整每个视图的框架。

谢谢!

【问题讨论】:

  • 我想指出我在另一个视图中有一个搜索显示控制器和搜索栏,连接到一个 UITableViewController,它可以很好地转换。也许这与问题有关?
  • 我也有同样的问题,这个话题有更新吗?
  • 我有同样的设置和同样的问题。
  • 我认为这与成为导航控制器层次结构中的第一个视图有关。例如,这只发生在与 tabbarcontroller 上的选项卡关联的视图中。

标签: ios uisearchbar ios7 statusbar uisearchdisplaycontroller


【解决方案1】:

将以下行放入 viewDidLoad 为我修复了它:

self.edgesForExtendedLayout = UIRectEdgeNone;

【讨论】:

  • 如果您要走这条路,假设您的搜索栏位于屏幕顶部,self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight; 可能是一个更好、更通用的解决方案。 (这将保留其他边缘的扩展布局,这对于屏幕底部模糊的工具栏之类的东西很重要。)
  • 只需检查 [self respondsToSelector:@selector(edgesForExtendedLayout)] 以防止
  • @richy 没明白你的意思。如果在 Xcode 4.x 中打开相同的代码,我会收到错误。
  • Jayprakash XCode 4.x 只支持 iOS6.x 及以下,所以你需要做if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){self.edgesForExtendedLayout = UIRectEdgeNone;}
  • 这对我不起作用,直到我看到视图控制器有 SearchDisplayControllers 的引用。一旦我在 IB 中链接了它,它就起作用了!
【解决方案2】:

感谢 hodade 带领我走上正轨!您的解决方案有效,只是它只移动了搜索栏的框架,将我的其他子视图留在了错误的位置。我唯一改变的是移动视图中的所有子视图,并为其设置动画。

谢谢!

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
        }];
    }
}

-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformIdentity;
        }];
    }
}

【讨论】:

  • 这和 hodade 的回答对我没有帮助。它仍然会自动向上移动搜索栏。
  • 经过进一步审查,这似乎是一个时间问题。使用 DidBeginSearch 将使它在状态栏下动画,然后再往下返回一些......
  • 在某些情况下,如果不添加任何内容,它在 iOS7 中对我有用..但在某些情况下它不起作用..原因是什么?为什么我们需要编写上述代码?
【解决方案3】:

您可能没有使用半透明导航栏? 如果是这样,这将解决它。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

【讨论】:

  • self.edgesForExtendedLayout = UIRectEdgeNone;在我的情况下不起作用谢谢@tachiba
【解决方案4】:

只需将以下代码放入 -(void) ViewDidLoad。它适用于 iOS 7 及更高版本

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

更新:

if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

【讨论】:

  • 非常感谢@Salim!此解决方案适用于嵌入在 iPad/iPhone6+ 上作为弹出窗口打开的 UIViewController 中的 UISearchBar。
【解决方案5】:

我做了下面的代码来解决这个问题。

    - (void) viewDidLayoutSubviews
{
         if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
        {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
            viewBounds.origin.y = topBarOffset * -1;
            self.view.bounds = viewBounds;
        }
}

【讨论】:

  • 我怀疑,这应该进入 UISearchDisplayController 子类?这没有视图属性。
  • 谢谢..这对我有帮助。
【解决方案6】:

这似乎描述了我遇到的问题;希望它会帮助我以前的职位的人。

  1. 对已添加到 UIViewController/UITablewViewController 的 SearchDisplayController 进行子类化,

  2. 在它的实现中添加这样的东西:

     - (void)setActive:(BOOL)visible animated:(BOOL)animated
    {
        [super setActive:visible animated:animated];
    
        [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
    
        CGRect frame = self.searchResultsTableView.frame;
        frame.origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame);
    
        frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame);
    
        self.searchResultsTableView.frame = frame;
    
        frame = self.searchBar.frame;
        self.searchBar.frame = frame;
    
        [self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView];
    
    }
    

【讨论】:

  • 太棒了,这适用于模拟器中的 iOS7(和 8)。不知道为什么这不更高。
【解决方案7】:

我认为也许将其添加到 viewDidLoad 会有所帮助:

if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;

}

【讨论】:

  • 或者实际设置标志来调整它们以用于表格视图
【解决方案8】:

添加

self.definesPresentationContext = YES;

您可以从这里阅读更多内容:UISearchController and definesPresentationContext

来自 Apple 文档:UISearchController documentation

注意: UISearchDispalyController 在 iOS7 中已弃用,在 iOS8 中使用 UISearchController 代替,上述方法使用 UISearchController

【讨论】:

    【解决方案9】:

    就我而言,搜索栏下方的视图位于正确的位置,只有搜索栏与状态栏重叠。在这种情况下,这种代码的和平工作正常:

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {        
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
            CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
            CGRect frame = self.searchBar.frame;
            frame.origin.y += statusBarFrame.size.height;
            self.searchBar.frame = frame;
        }
    }
    
    - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
            CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
            CGRect frame = self.searchBar.frame;
            frame.origin.y -= statusBarFrame.size.height;
            self.searchBar.frame = frame;
        }
    }
    

    希望对其他人有用

    【讨论】:

      【解决方案10】:
      -(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
              CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
              CGRect frame = controller.searchBar.frame;
              frame.origin.y += statusBarFrame.size.height;
              controller.searchBar.frame = frame;
          }
      }
      
      -(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
              CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
              CGRect frame = controller.searchBar.frame;
              frame.origin.y -= statusBarFrame.size.height;
              controller.searchBar.frame = frame;
          }
      }
      

      【讨论】:

        【解决方案11】:

        仅当您的导航栏未隐藏时,上述答案才有效。如果您的导航栏已隐藏,请尝试以下操作:

        -(void)viewDidAppear:(BOOL)animated{
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
            [self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];
        
            }
        }
        

        根据这篇文章:UISearchBar overlaps status bar in iOS

        【讨论】:

          【解决方案12】:

          将已添加到 UIViewController/UITablewViewControllerSearchDisplayController 子类化并将其添加到其实现中 -

          - (void)setActive:(BOOL)visible animated:(BOOL)animated
          {
              if(self.active == visible) return;
              [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
              [super setActive:visible animated:animated];
              [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
              if (visible) {
                  [self.searchBar becomeFirstResponder];
              } else {
                  [self.searchBar resignFirstResponder];
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-30
            • 1970-01-01
            • 2014-05-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多