-1

我使用 iOS7 SDK 创建了我的第一个应用程序,这是一个没有 Storyboard 的“空应用程序”。状态栏始终位于所有其他视图之上。所以我添加了这段代码:

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

但它什么也没改变。我的完整代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(30, 0, 200, 300)];
    [v setBackgroundColor:[UIColor greenColor]];

    [self.view addSubview:v];
}
4

1 回答 1

1

edgeForExtendedLayout 仅适用于存在 UI 容器视图控制器(例如 UINavigationController)的情况。为避免这种重叠,您应该使用 -topLayoutGuide(它也存在底部 layoutGuide)。我在 github 上做了一个要点,它使用容器视图作为具有此布局集的 vc 主视图的子视图。

//This should be added before the layout of the view
- (void) adaptToTopLayoutGuide {
    //Check if we can get the top layoutguide
    if (![self respondsToSelector:@selector(topLayoutGuide)]) {
        return;
    }
    //tankView is a contaner view
    NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun
    [self.view removeConstraints:array];
    NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}];
    [self.view addConstraints:constraintsVertical];
    NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}];
    [self.view addConstraints:constraintsHorizontal];

}

这个片段让一个控件看到我们有一个 topLayoutGuide,稍后它删除了与 superview 相关的 tankView(即在 xib 中添加和连接的容器视图)上的约束,并基于 topLayoutGuide 添加了新的约束。

于 2013-11-03T16:05:37.773 回答