gpt4 book ai didi

iOS 容器 View 不支持 intrinsicContentSize

转载 作者:可可西里 更新时间:2023-11-01 03:06:13 27 4
gpt4 key购买 nike

我想使用容器 View 来包含相机预览。我希望相机在中间居中并保持适当的纵横比。 (它是粉红色的,可以很明显地看出它的框架在哪里)

Story board showing container view

我停留在尝试让相机预览显示的尺寸小于容器的第一步。

我有一个用于相机 Controller View 的 UIView 子类,并且有代码:

- (CGSize)intrinsicContentSize
{
return CGSizeMake(320, 240);
}

不幸的是,这没有兑现:

iPad simulator result

通过阅读文档,intrinsicContentSize 看起来就是我想要的。最终我也想使用自动布局,但我试图一次解决一件事。

我如何使它工作?

最佳答案

自动布局使用 intrinsicContentSize 属性。如果您不使用自动布局,系统将不会向任何 View 询问其 intrinsicContentSize

除非您编写一些代码,否则粉红色 View 将被强制调整为容器 View 的大小。无论您是否使用自动布局都是如此。这正是在 Storyboard 中创建的容器 View 的工作方式。系统不会向您的粉红色 View 询问其 intrinsicContentSize

因为您暗示您使用自动布局,所以这里有一种方法可以使容器 View 成为其内容 View 的 intrinsicContentSize。创建一个名为 CameraContainerViewUIView 子类,并将其设置为容器 View 的自定义类。在这个新类中覆盖 addSubview::

@implementation CameraContainerView

- (void)addSubview:(UIView *)subview {
[super addSubview:subview];
CGRect frame = self.frame;
frame.size = subview.intrinsicContentSize;
self.frame = frame;
}

@end

这在我的测试中已经足够了。 (如果 subview 动态更改其 intrinsicContentSize,它将不会保持最新状态。)

如果您决定使用自动布局,则需要在容器 View 和内容 View 之间设置约束,并且需要删除任何冲突的约束。

首先,在您的 Storyboard中,确保容器 View 具有明确的宽度和高度限制。 (这些约束将被删除,因此它们的确切大小无关紧要。)为 CameraContainerView 提供每个约束的导出:

@interface CameraContainerView ()

@property (nonatomic, strong) IBOutlet NSLayoutConstraint *widthConstraint;
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *heightConstraint;

@end

将这些导出连接到 Storyboard 中的约束。请注意,这些 socket 在 CameraContainerView 上,ViewController 上,所以不要尝试从 View Controller 控制拖动到约束;那是行不通的。

还要确保容器 View 没有固定到其父 View 的左右(前导和尾随)边缘,并且它没有固定到其父 View 的顶部和底部。容器 View 的大小仅由其明确的宽度和高度约束决定,这一点很重要。

在 Storyboard中设置约束并连接 socket 后,您可以重写 addSubview: 以实现自动布局。您需要在嵌入式 View 上关闭 translatesAutoresizingMaskIntoConstraints:

@implementation CameraContainerView

- (void)addSubview:(UIView *)subview {
subview.translatesAutoresizingMaskIntoConstraints = NO;

[super addSubview:subview];

然后您需要删除从 Storyboard 中加载的宽度和高度限制:

    [self removeConstraint:self.widthConstraint];
self.widthConstraint = nil;
[self removeConstraint:self.heightConstraint];
self.heightConstraint = nil;

最后,您可以设置新的约束,将嵌入 View 定位在容器 View 中,并使容器 View 与嵌入 View 的大小相匹配:

    NSDictionary *views = NSDictionaryOfVariableBindings(subview);
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[subview]|"
options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[subview]|"
options:0 metrics:nil views:views]];
}

@end

这在我的测试中有效,如果 subview 动态更改其 intrinsicContentSize,只要 subview 发送自身 invalidateIntrinsicContentSize,它应该保持最新。

关于iOS 容器 View 不支持 intrinsicContentSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com