自动布局内部内容大小以填充屏幕



我有一个使用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的宽度设置约束来填充屏幕。

最新更新