自动布局内在内容大小以填满屏幕

Posted

技术标签:

【中文标题】自动布局内在内容大小以填满屏幕【英文标题】:Auto Layout intrinsic content size to fill screen 【发布时间】:2014-09-22 19:49:05 【问题描述】:

我有一个使用AVCaptureVideoPreviewLayer 显示设备摄像头馈送的视图。我计划这个视图将填满设备的屏幕并在顶部和底部留出一些空间。

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

Q2 在我的UIView 子类中实现intrinsicContentSize 可以使用[[self window] screen] 吗?如果布局系统在视图附加到屏幕后询问视图调用intrinsicContentSize,这将起作用。如果调用发生在此之前,视图将不知道它将附加到哪个屏幕,这将失败。

【问题讨论】:

【参考方案1】:

我最终没有为此使用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 填满屏幕。

【讨论】:

以上是关于自动布局内在内容大小以填满屏幕的主要内容,如果未能解决你的问题,请参考以下文章

为自动布局设置数字 UILabel 以正确计算内在内容大小

具有自动布局的 UITableView 在横向模式下不会填满屏幕。为啥?

调整 ImageView 的大小以使整个布局填满屏幕

自动布局 - 如何分配内容以按比例填充屏幕[重复]

Flex布局

没有内在尺寸的自动布局