我将视图(由视图控制器加载)添加到另一个视图。添加后,视图的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
相关的故事板 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
如果我记录(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]
创建视图,然后使用相同的方法将其添加到“主视图”,那么一切都运行良好。
奇怪?
答案 0 :(得分:5)
view.translatesAutoresizingMaskIntoConstraints = NO ;
这意味着:&#34;使用自动布局设置我的尺寸和位置。&#34;但是你没有自动布局约束,所以当布局发生时你会得到废话。因此,插入的视图永远不会出现。
您还会询问标签的存在/不存在以及它对此结果的影响。它不仅仅是一个标签。它是任何子视图。这是因为子视图的存在会影响自动布局的运行方式。没有子视图,自动布局似乎说,&#34;好的,这里无事可做&#34;。因此,你确实看到插入的视图在正确的位置,但这是一种意外(如果你明白我的意思,那就是运气不好)。
view.translatesAutoresizingMaskIntoConstraints = YES;
这意味着:使用我的框架来制作约束。因此,当布局发生时,我们做有约束,插入的视图视图出现在您期望的位置。
在您的情况下,您最好在代码中对translatesAutoresizingMaskIntoConstraints
说 nothing ,因为您没有对视图应用任何显式约束,因此您会获得隐式约束框架,这是你想要的。或者,您可以完全关闭自动布局 - 它在两个笔尖中都已打开。