我有一个使用AVCaptureVideoPreviewLayer
显示设备的相机馈送的视图。我计划这个视图将填充设备的屏幕,并在顶部和底部留出一些空间。
Q1对于我的视图来说,实现intrinsicContentSize
并让它提供缩放后的大小,使其刚好适合屏幕是否有意义?还是我误解了自动布局和intrinsicContentSize
?
Q2在我的UIView
子类中实现intrinsicContentSize
可以使用[[self window] screen]
吗?如果布局系统在视图连接到屏幕后要求视图调用intrinsicContentSize
,则此操作将起作用。如果调用在此点之前发生,则视图将不知道它将连接到的屏幕,这将失败。
我最终没有使用intrinsicContentSize
。允许CameraView
在我的故事板中控制其大小似乎更简单、更灵活。
我的CameraView
是一个UIView
子类,它在updateConstraints
覆盖中设置并更新aspectRatioConstraint
属性:
-(void) updateConstraints
{
if(!_aspectRatioConstraint)
{
const CGSize videoSize = [self videoSize];
NSLayoutConstraint *const aspectConstraint =
[NSLayoutConstraint constraintWithItem: self
attribute: NSLayoutAttributeWidth
relatedBy: NSLayoutRelationEqual
toItem: self
attribute: NSLayoutAttributeHeight
multiplier: videoSize.height / videoSize.width
constant: 0];
[self setAspectRatioConstraint: aspectConstraint];
[self addConstraint: aspectConstraint];
}
[super updateConstraints];
}
(约束比率由摄像机设备在[self videoSize]
中报告的内容决定)
在故事板中,我还在相机视图上设置了一个纵横比约束,但我检查了该约束上的placeholder
选项,以便在构建时将其删除。我把它设置为4:3,这可能与真正的相机相同,也可能不同——这只是为了在视图布局时给我正确的帧。
我通过在故事板中对CameraView
的宽度设置约束来填充屏幕。