在 iOS 9 中,如果对页面使用 class 而不是 UIViewController,我如何创建约束以避免破坏状态 and/or 标签栏?

In iOS 9, if using a class other than UIViewController for a page, how can I create a constraint to avoid clobbering the status and/or tab bars?

所有指南都建议调整顶部布局指南以避免破坏状态栏。但是,如果页面是使用 UIViewController 以外的视图控制器创建的(例如,如果它是使用 UITableViewController 创建的,因为页面主要是 table 视图),则它没有布局指南。我怎样才能避免状态栏?

我发现 UITableViewController 比它的价值更麻烦,就像这个人:How do I make my iOS7 UITableViewController NOT appear under the top status bar?

现在,当我实现 table 视图时,我发现将 TableView 设为 UIViewController 的 属性 更容易,然后将委托和数据源职责设置为 UIViewController。从那里您可以根据需要自定义它。您可以使用状态栏设置(推断、None、黑色等)等 Storyboard 选项,但根据我的经验,我发现将 UITableView 放入 UIViewController 中效果最佳。

示例Header:

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

控制器中的示例代码

@synthesize myTableView;
//**** Table View Delegate and Data Source ****//

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *myCellIdentifier = @"myCell";
    MyTableViewCell *cell = (MyTableViewCell *)[myTableView dequeueReusableCellWithIdentifier:myCellIdentifier];
    //Customize the cell
    return cell;
}

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [myDataSource count];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //perform some action on click
}

没有 NavigationController 的 UITableViewController 的另一个例子和状态栏的问题:iOS 7: UITableView shows under status bar

一个UITableViewController(以及所有其他标准视图控制器)继承自UIViewController,因此它们具有UIViewController的所有属性和方法,包括顶部和底部布局指南,绝对可以用。

由于UITableViewController继承自UIViewController,那么在Tableviewcontroller中,可以重写该方法

- (UIStatusBarStyle)preferredStatusBarStyle {
    if(<#condition>)
    {
        return UIStatusBarStyleLightContent;
    }
    else
    {
        return UIStatusBarStyleDefault;
    }
}

如果你必须使用 UITableViewController,你可以将它嵌入到带有 Embed Segue 的 UIViewController 中,然后在 UIViewController 中做任何你想做的事情