UIView 固定到屏幕边缘,但框架保持 0,0

Posted

技术标签:

【中文标题】UIView 固定到屏幕边缘,但框架保持 0,0【英文标题】:UIView pinned to edges of screen, but frame remains 0,0 【发布时间】:2014-08-29 20:03:33 【问题描述】:

我想在覆盖整个屏幕的视图层次结构中插入一个 UIView。我的方法是创建一个 UIView 实例,将其添加到主视图,然后添加约束以将我的新视图的边缘固定到父视图。 UIViews 本身没有固有的内容大小,但是通过将边缘固定到 superview,UIView 应该有一个更大的框架。

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *inviteCodeView =  [[UIView alloc] initWithFrame:CGRectZero];
inviteCodeView.opaque = NO;
inviteCodeView.alpha = 0.5;
inviteCodeView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
[inviteCodeView setTranslatesAutoresizingMaskIntoConstraints:NO];

inviteCodeView.backgroundColor = [UIColor redColor];
[self.view addSubview:inviteCodeView];
NSDictionary *views = NSDictionaryOfVariableBindings(inviteCodeView);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[inviteCodeView]-0-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[inviteCodeView]-0-|" options:0 metrics:nil views:views]];

可能出了什么问题,或者我对自动布局的理解不正确?

【问题讨论】:

【参考方案1】:

虽然这并不能直接回答您关于自动布局的问题,但我发现如果没有它,您想要做的事情大大 会更容易。只需将视图的框架设置为视图控制器的框架,并将视图的自动调整掩码设置为灵活的高度和宽度,框架将自动调整大小没有问题。

UIView *inviteCodeView =  [[UIView alloc] initWithFrame:self.view.frame];
inviteCodeView.opaque = NO;
inviteCodeView.alpha = 0.5;
inviteCodeView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
inviteCodeView.autoresizingMask = UIViewAutoresizingFlexibleHeight + UIViewAutoresizingFlexibleWidth;
[self.view addSubview:inviteCodeView];

此外,使用您最初提供的代码,如果您删除 first 行,其中您将超级视图的 TranslatesAutoresizingMaskIntoConstraints 设置为 NO,则一切正常:

//    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    UIView *inviteCodeView =  [[UIView alloc] initWithFrame:CGRectZero];
    inviteCodeView.opaque = NO;
    inviteCodeView.alpha = 0.5;
    inviteCodeView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
    [inviteCodeView setTranslatesAutoresizingMaskIntoConstraints:NO];

    inviteCodeView.backgroundColor = [UIColor redColor];
    [self.view addSubview:inviteCodeView];
    NSDictionary *views = NSDictionaryOfVariableBindings(inviteCodeView);

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[inviteCodeView]-0-|" options:0 metrics:nil views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[inviteCodeView]-0-|" options:0 metrics:nil views:views]];

【讨论】:

以上是关于UIView 固定到屏幕边缘,但框架保持 0,0的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 中定位文本

使用自动布局使 UIView 全屏

如何将视图固定到屏幕边缘?

UIView AutoresizingMask 用于将按钮固定到右下角

Autolayout 将 UIView 放在边距和另一个 UIView 之间

如何以编程方式更改布局边距