iOS 7:UITableView显示在状态栏下

Nic*_*ith 219 ios uistatusbar ios7

我的应用程序的第一个屏幕是UITableViewController没有导航栏,这意味着内容在状态栏下流动,因此存在大量文本冲突.我已经调整了两个属性Under top bars,Adjust scroll view insets哪些实际上阻止了它滚动,但代价是保持表视图的顶部.我试图将UITableView帧设置为偏移20像素,但它似乎没有生效,因为我目前需要该应用程序与iOS 6兼容我无法跳转到iOS 7 Storyboards强制自动布局使用顶部高度指南.有没有人找到适用于这两个版本的解决方案?

事情我已经尝试:设置edgesForExtendedLayout,故事情节中更改设置Under top barsAdjust scroll view,迫使帧到一个新的领域.

一张图片胜过千言万语: 状态栏下的流量

mar*_*osb 365

对于有兴趣复制此内容的任何人,只需按照以下步骤操作:

  1. 创建一个新的iOS项目
  2. 打开主故事板并删除默认/初始 UIViewController
  3. UITableViewController从对象库中拖出一个新的
  4. 将其设置为初始视图控制器
  5. 向表格提供一些测试数据

如果您按照上述步骤操作,当您运行应用程序时,您将看到没有任何内容,包括将Xcode的复选框调整为"在{顶部,底部,不透明}条形图下延伸边缘",以阻止第一行显示在状态栏下方,你也不能以编程方式解决这个问题.

例如,在上述情况下,下面将有没有效果:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;
Run Code Online (Sandbox Code Playgroud)

这个问题非常令人沮丧,我相信这是苹果公司的一个错误,特别是因为它出现在他们自己的预先连线UITableViewController的对象库中.

我不同意所有试图通过使用任何形式的"幻数"来解决这个问题的人,例如"使用20px的delta".这种紧密耦合的编程绝对不是Apple希望我们在这里做的.

我发现了两个解决这个问题的方法:

  • 保留UITableViewController的场景:
    如果你想保持UITableViewController在故事板,而无需手动将它变成另一种观点,你可以嵌入UITableViewControllerUINavigationController(编辑>嵌入>导航控制器),并取消选中'显示导航栏’中的检查.这解决了这个问题,无需额外调整,它还可以保留UITableViewController故事板中的场景.

  • 使用AutoLayout并将其嵌入UITableView到另一个视图中 (我相信这是Apple希望我们这样做的方式):
    创建一个空UIViewController并拖入UITableView其中.然后,按住Ctrl键拖动到UITableView状态栏.当鼠标到达状态栏的底部时,您将看到一个显示"顶部布局指南"的Autolayout气泡.释放鼠标并选择"垂直间距".这将告诉布局系统将其放置在状态栏的正下方.

我已经在空应用程序上测试了两种方式,但它们都有效.您可能需要做一些额外的调整才能使它们适合您的项目.

  • 当我从tableview进行控制拖动时,我不会遇到状态栏.视图中没有可见的状态栏,不确定你的意思...... (6认同)
  • 仅供参考,选项1(嵌入在导航控制器中)导致在滚动表格时,单元格在半透明状态栏后面可见. (5认同)
  • @RyanR我也注意到了,但我认为在某些时候它还可以.Apple在移动Safari的打开的标签视图中做了同样的事情,标签将显示在状态栏下方.导航控制器解决方案是最简单的解决方法,我根本就是它.但是,半透明状态栏是​​一个愚蠢的想法. (4认同)
  • 选项2*在Xcode 5中不再有效*所描述的动作(ctrl-drag)应该永远不会有效,因为它由Outlets系统拥有,但即使你手动拖动到左侧的场景树,顶部布局指南也是如此不工作(它应该做,AFAICT - 我相信这是AutoLayout中的另一个主要错误:( :() (4认同)
  • 取消选中"Under Top Bars"在Xcode 5.0.2中适用于我 (3认同)
  • @PrideChung在使用带有tableview的标题时看起来很愚蠢,标题保持固定在顶部,元素将消失在后面 - 并在透明状态栏后面重新显示... (3认同)

lip*_*pka 85

如果你以编程方式做事并且正在使用UITableViewController没有UINavigationController你最好的选择,那就是在以下方面做以下事情viewDidLoad:

斯威夫特3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
Run Code Online (Sandbox Code Playgroud)

早些时候斯威夫特

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)

UITableViewController仍将滚动状态栏的后面,但是当滚动到顶部不会在它之下.

  • 我使用`UIApplication.sharedApplication.statusBarFrame.size.height`而不是20. (10认同)
  • 硬编码高度值不是最好的主意. (8认同)
  • 是的,请使用`topLayoutGuide`长度. (3认同)

Stu*_*ner 23

请注意:这适用于我的以下配置:

  • 屏幕顶部没有导航栏(表格视图与状态栏相符)
  • 表视图是不可滚动的

如果不满足上述两个要求,您的milage可能会有所不同.

原帖

我以编程方式创建了我的视图,最终为我工作:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}
Run Code Online (Sandbox Code Playgroud)

来源(在第39页底部的topLayoutGuide部分).


Eri*_*fin 20

添加到顶部答案:

在第二种方法最初似乎没有工作后,我做了一些额外的修补,并找到了解决方案.

TLDR; 最佳答案的第二个解决方案几乎可以工作,但对于某些版本的xCode ctrl +拖动到"顶部布局指南"并选择垂直间距不会做任何事情.但是,首先调整表格视图的大小,然后选择"顶部空间到顶部布局指南"工作


  1. 将空白ViewController拖到故事板上. 查看控制器

  2. 将UITableView 对象拖到View中.(不是UITableViewController).使用蓝色布局指南将其放置在正中心.

表视图 中心图像

  1. 将UITableViewCell拖到TableView中.这将是您的原型重用单元格,因此不要忘记在"属性"选项卡下设置它的重用标识符,否则您将崩溃.

添加表视图单元格 重用标识符

  1. 创建UIViewController的自定义子类,并添加<UITableViewDataSource, UITableViewDelegate>协议.不要忘记在Identity Inspector中将storyboard的ViewController设置为此类.

  2. 在实现文件中为TableView创建一个插座,并将其命名为"tableView"

创建出口 的tableView

  1. 右键单击TableView并将dataSource和委托拖到ViewController.

dataSource委托

现在对于未剪切到状态栏的部分.

  1. 抓住表格视图的上边缘并将其向下移动到靠近顶部的其中一个蓝色虚线自动布局指南

调整

  1. 现在,您可以控制从"表格视图"拖动到顶部,然后选择"顶部空间到顶部布局指南"

顶部空间到顶部布局指南

  1. 它会给你一个关于TableView模糊布局的错误,只是添加缺失约束和你的完成.

添加缺失约束

现在您可以像平常一样设置表格视图,它不会剪切状态栏!


小智 11

- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1

  • switch <= to>并删除空的if块 (2认同)

upl*_*com 8

这是如何在"Swift"中编写它对@ lipka的答案进行调整:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
Run Code Online (Sandbox Code Playgroud)


peg*_*peg 7

在故事板上选择UIViewController,取消选中"在顶栏下扩展边缘"选项.为我工作.:)


Dav*_*d T 5

对于Xcode 7,取消勾选导航栏的"半透明"复选标记对我有用.

在此输入图像描述