【问题标题】:UITableView content overlaps Status Bar when UISearchBar is active当 UISearchBar 处于活动状态时,UITableView 内容与状态栏重叠
【发布时间】:2014-06-01 05:39:18
【问题描述】:

我有一个带有 UISearchBar 和 UISearchDisplayController 的 UITableViewController。这存在于 UINavigationController 中的 UIViewController 中的容器视图中。我制作了这张图片来帮助描述结构:

这才是真正的样子:

当我点击搜索栏时,我必须隐藏导航栏。通常,这会自行发生,但由于我的 UITableViewController 位于容器视图中,因此我必须自己处理该更改。这就是它的样子,注意状态栏是白色的,因为导航栏是白色的,即使它现在是隐藏的。

一旦我开始输入一些搜索文本,结果就会显示出来。如果我向上滚动这些结果,它们会通过搜索栏下方,但它们会与状态栏重叠,这很不吸引人。

如果不涉及 Container View,那么这一切都按预期工作,表格内容通过状态栏下方,但涉及 ContainerView,表格文本和状态栏发生冲突。

如何让文本像往常一样在状态栏下移动?

【问题讨论】:

    标签: ios uitableview uisearchbar uisearchdisplaycontroller uicontainerview


    【解决方案1】:

    我已经搜索了几个小时,我的最终结果是将此行放入 viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

    问题解决了:)

    【讨论】:

    • 这真的很有帮助,即使我遇到了不同的问题!我的问题是当搜索栏处于活动状态时我无法控制状态栏的背景颜色。谢谢
    • 仅供遇到此问题的人使用。确保在 containerViewController 和 searchResultsViewController 中添加self.extendedLayoutIncludesOpaqueBars = YES
    • 您也可以从情节提要中视图控制器的属性检查器执行此操作(检查扩展边缘 -> 在不透明条下)
    • definesPresentationContext = true 和 self.extendedLayoutIncludesOpaqueBars = true 为我修复了它!
    【解决方案2】:

    尝试在您的TableViewControllerviewDidLoad 中设置definesPresentationContext

    斯威夫特

    override func viewDidLoad() {
        super.viewDidLoad()
    
        definesPresentationContext = true
    }
    

    目标-C

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.definesPresentationContext = YES;
    }
    

    【讨论】:

      【解决方案3】:

      这对我有用:

      做:

      • 使用 UISearchController(不是单独放置的 UISearchBar)
      • 如果还没有,请将您的 VC 放在 UINavigationController 中。如果需要,将导航设置为不“显示导航栏”。
      • 为 UITableView 使用自动布局(不是 springs 和 struts)并将表格顶部固定到 VC 视图的顶部。
      • 添加此委托方法:

      - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

      不要:

      • 摆弄edgeForExtendedLayout
      • 使用 extendedLayoutIncludesOpaqueBars 摆弄
      • 摆弄表格的 contentInset

      【讨论】:

        【解决方案4】:

        这基本上是由于导航栏的透明性,通常视图控制器通过更正拥有的视图或子视图的顶部插入(如果它们是(或继承)自 UIScrollView)来修复重叠。您有 2 个选项,一个是将导航栏的透明度设置为 no,另一个是将 edgeForExtendedLayout 设置为 none 或仅保留底部。

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

        这些建议仅适用于 iOS7,如果您在设置这些属性之前部署在较低的目标检查。
        另一种方法,但我没有测试可以读取--topLayoutGuide 长度和 -searchDisplayControllerWillBeginSearch 尝试设置相同长度的 topInsets。这样,您仍然应该保持半透明。

        【讨论】:

        • 我遇到了与 OP 完全相同的问题,但我没有显示 NavBar。这是在一个导航控制器中,我将其作为模式弹出窗口。由于我没有显示导航栏,因此设置半透明并不能解决问题。
        • 尝试使用 edgesForExtendedLayout
        • 更可能还有..-setAutomaticallyAdjustScrollInsets
        • 不幸的是,这些都没有帮助。我最终使用了导航栏。
        【解决方案5】:

        我有 UISearchBar 和 UISearchDisplayController。

        在viewdidload中:

        self.edgesForExtendedLayout = UIRectEdgeNone;
        [searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault];
        

        从 UIColor 获取图像的方法:

        - (UIImage *)imageWithColor:(UIColor *)color
        {
            CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
            UIGraphicsBeginImageContext(rect.size);
            CGContextRef context = UIGraphicsGetCurrentContext();
        
            CGContextSetFillColorWithColor(context, [color CGColor]);
            CGContextFillRect(context, rect);
        
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        
            return image;
        }
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题:

          - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
          {
              controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar
          }
          
          - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
          {
              controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines
          }
          

          【讨论】:

            【解决方案7】:

            在我的情况下,我不想隐藏 UINavigationBar,但我在间隙和其他副作用方面遇到了类似的问题。其中之一是在 UIViewController 之间切换后 UISearchBar 丢失,而 UISearchDisplayController 可见(我正在使用 SWRevealViewController 在 UIViewController 之间切换)。此问题仅发生在 iPad 上。结果发现 UISearchBar 突然隐藏在 UINavigationBar 后面了。现在我用 UIContainerView 中呈现的 UITableViewController 中的以下代码行解决了我所有的问题:

            - (UINavigationController *)navigationController {
                return nil;
            }
            

            这些行阻止 UISearchDisplayController 到达并更改我的 UINavigationController。我还将这个方法子类化为“MyContainerTableViewController”类,现在将这个类用于所有嵌入式 UITableViewController。

            我仍在使用 UISearchDisplayController 来支持 iOS 7。

            【讨论】:

              【解决方案8】:

              以下 hack 对我有用:

              - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
              {
                  return (self.searchController.isActive  && section == 0) ? 22.0f : 0.0f;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-09-29
                • 1970-01-01
                • 2016-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-09-16
                相关资源
                最近更新 更多