自动布局使用该intrinsicContentSize
属性。如果您不使用自动布局,系统将不会要求任何视图为其intrinsicContentSize
.
除非您编写一些代码,否则粉红色视图将被强制为容器视图的大小。无论您是否使用自动布局,这都是正确的。这正是在故事板中创建的容器视图的工作方式。系统不会询问您的粉色视图intrinsicContentSize
。
由于您暗示您没有使用自动布局,因此您可以通过以下一种方法使容器视图成为intrinsicContentSize
其内容视图的一部分。UIView
创建一个被调用的子类CameraContainerView
并将其设置为容器视图的自定义类。addSubview:
在这个新类中覆盖:
@implementation CameraContainerView
- (void)addSubview:(UIView *)subview {
[super addSubview:subview];
CGRect frame = self.frame;
frame.size = subview.intrinsicContentSize;
self.frame = frame;
}
@end
这在我的测试中就足够了。(如果子视图动态更改,它将不会保持最新intrinsicContentSize
。)
如果决定使用自动布局,则需要在容器视图和内容视图之间设置约束,并且需要删除任何冲突的约束。
首先,在您的故事板中,确保容器视图具有明确的宽度和高度约束。(这些约束将被删除,因此它们的确切大小无关紧要。)CameraContainerView
为这些约束中的每一个提供一个出口:
@interface CameraContainerView ()
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *widthConstraint;
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *heightConstraint;
@end
将这些出口连接到情节提要中的约束。请注意,这些插座是 on CameraContainerView
,而不是on ViewController
,所以不要尝试从视图控制器控制拖动到约束;那是行不通的。
还要确保容器视图没有固定到其父视图的左右(前导和后导)边缘,并且它没有固定到其父视图的顶部和底部。容器视图的大小仅由其明确的宽度和高度约束决定,这一点很重要。
在情节提要中设置约束并连接出口后,您可以重写addSubview:
自动布局。您需要关闭translatesAutoresizingMaskIntoConstraints
嵌入式视图:
@implementation CameraContainerView
- (void)addSubview:(UIView *)subview {
subview.translatesAutoresizingMaskIntoConstraints = NO;
[super addSubview:subview];
然后您需要删除从情节提要中加载的宽度和高度约束:
[self removeConstraint:self.widthConstraint];
self.widthConstraint = nil;
[self removeConstraint:self.heightConstraint];
self.heightConstraint = nil;
最后,您可以设置新的约束,将嵌入视图定位在容器视图中,并使容器视图与嵌入视图的大小相匹配:
NSDictionary *views = NSDictionaryOfVariableBindings(subview);
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[subview]|"
options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[subview]|"
options:0 metrics:nil views:views]];
}
@end
这在我的测试中有效,并且如果子视图intrinsicContentSize
动态更改它应该保持最新,只要子视图发送自己invalidateIntrinsicContentSize
。