为什么我的UIView(从UIViewController加载)的大小是nul,CGSizeZero,零,......?

时间:2015-04-30 16:36:40

标签: ios uiview uiviewcontroller xib

情况

我将视图(由视图控制器加载)添加到另一个视图。添加后,视图的size等于(0,0)。我不明白为什么,我想知道。

我知道如何解决这个问题(使用约束,或者通过“手动”创建的view.translatesAutoresizingMaskIntoConstraints = YES自动创建)。

  

我真正想要的是理解为什么,在这种情况下,它没有   工作

代码

我的主视图控制器代码

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *mainView;
@property (nonatomic, strong, readwrite) ColorViewController * colorVC ;
@end

@implementation ViewController

+ (void)fillView:(UIView *)bigView
        withView:(UIView *)view
{
    view.translatesAutoresizingMaskIntoConstraints = NO ;
    //     view.translatesAutoresizingMaskIntoConstraints = YES ;

    view.frame = bigView.bounds ;

    [bigView addSubview:view] ;
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    self.colorVC = [ColorViewController new] ;

    [ViewController fillView:self.mainView
                    withView:self.colorVC.view] ;
}


@end

相关的故事板 enter image description here Capture d'écran2015-04-30à17.25.32.png

代码ColorViewController

@implementation ColorViewController

- (void)viewDidLoad {
    [super viewDidLoad];


    CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0
    CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white
    CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black
    UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];

    self.view.backgroundColor = color ;
}


@end

其XIB

enter image description here

日志

如果我记录(ColorViewController)视图,我会得到:

2015-04-30 17:33:58.329 TEST_SUBVIEWS[51745:602214] <UIView: 0x7b4191e0; frame = (-179 -236; 0 0); autoresize = RM+BM; layer = <CALayer: 0x7b418ce0>>

最奇怪的事情

  • 真正奇怪的是,如果我删除上述XIB中的唯一对象(UILabel),那么一切运作良好。

  • 此外,如果我使用[UIView new]创建视图,然后使用相同的方法将其添加到“主视图”,那么一切都运行良好。

奇怪?

链接到github

上的最小非工作示例

https://github.com/colasjojo/ToyProjectForIssueWithSize

1 个答案:

答案 0 :(得分:5)

view.translatesAutoresizingMaskIntoConstraints = NO ;

这意味着:&#34;使用自动布局设置我的尺寸和位置。&#34;但是你没有自动布局约束,所以当布局发生时你会得到废话。因此,插入的视图永远不会出现。

您还会询问标签的存在/不存在以及它对此结果的影响。它不仅仅是一个标签。它是任何子视图。这是因为子视图的存在会影响自动布局的运行方式。没有子视图,自动布局似乎说,&#34;好的,这里无事可做&#34;。因此,你确实看到插入的视图在正确的位置,但这是一种意外(如果你明白我的意思,那就是运气不好)。

view.translatesAutoresizingMaskIntoConstraints = YES;

这意味着:使用我的框架来制作约束。因此,当布局发生时,我们有约束,插入的视图视图出现在您期望的位置。

在您的情况下,您最好在代码中对translatesAutoresizingMaskIntoConstraints nothing ,因为您没有对视图应用任何显式约束,因此您会获得隐式约束框架,这是你想要的。或者,您可以完全关闭自动布局 - 它在两个笔尖中都已打开。