我有一个视图,使用AVCaptureVideoPreviewLayer
显示设备的相机Feed。我计划这个视图将填满设备的屏幕,并在顶部和底部留出一些空间。
Q1 我的视图是否有意义实现intrinsicContentSize
并提供缩放时的大小以使其适合屏幕?或者我误解了自动布局和intrinsicContentSize
?
Q2 intrinsicContentSize
子类中UIView
的实施是否可以使用[[self window] screen]
?如果视图附加到屏幕后布局系统会询问视图调用intrinsicContentSize
,则此方法将起作用。如果在此点之前发生呼叫,则视图将不知道它将连接到的屏幕,这将失败。
答案 0 :(得分:0)
我最终没有使用intrinsicContentSize
。允许CameraView
在我的故事板中控制其大小似乎更简单,更灵活。
我的CameraView
,UIView
子类具有aspectRatioConstraint
属性,可在其updateConstraints
覆盖中设置和更新:
-(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
填满屏幕。