自动布局内在大小填充屏幕

时间:2014-09-22 19:49:06

标签: ios uikit autolayout

我有一个视图,使用AVCaptureVideoPreviewLayer显示设备的相机Feed。我计划这个视图将填满设备的屏幕,并在顶部和底部留出一些空间。

Q1 我的视图是否有意义实现intrinsicContentSize并提供缩放时的大小以使其适合屏幕?或者我误解了自动布局和intrinsicContentSize

Q2 intrinsicContentSize子类中UIView的实施是否可以使用[[self window] screen]?如果视图附加到屏幕后布局系统会询问视图调用intrinsicContentSize,则此方法将起作用。如果在此点之前发生呼叫,则视图将不知道它将连接到的屏幕,这将失败。

1 个答案:

答案 0 :(得分:0)

我最终没有使用intrinsicContentSize。允许CameraView在我的故事板中控制其大小似乎更简单,更灵活。

我的CameraViewUIView子类具有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填满屏幕。