UIStackView 中等宽的自定义子视图

Posted

技术标签:

【中文标题】UIStackView 中等宽的自定义子视图【英文标题】:Custom subviews with equal widths in UIStackView 【发布时间】:2017-08-03 10:17:43 【问题描述】:

我一直在尝试使用 3 个自定义视图 (PCSimpleDescriptionView) 实现视图 (PCHorizo​​ntalAdjustableView)。

PCSimpleDescriptionView 有一个垂直 UIStackView,在垂直 UIStackView 内有 2 个标签,如下所示:

具有水平 UIStackView 的 PCHorizo​​ntalAdjustableView 用于显示 3 个 PCSimpleDescriptionViews(添加颜色以突出显示 3 个视图)。

我得到的结果是这样的:

理想情况下,我希望 3 个大小相同的 PCSimpleDescriptionViews 在可用空间中显示标签。

示例项目上传here

知道我应该怎么做才能实现这一目标吗?

【问题讨论】:

【参考方案1】:

你的错误是- (void)setup方法

您从 xib 添加视图就像子视图 [[NSBundle mainBundle] loadNibNamed:@"PCHorizontalAdjustableView" owner:self options:nil]; [self addSubview:self.view];

您需要在- (void)layoutSubviews 方法中为这个新的子视图或控制框架添加约束

将此函数添加到自定义视图的类(PCHorizo​​ntalAdjustableView、PCSimpleDescriptionView)`

- (void)layoutSubviews 
    [super layoutSubviews];

    self.view.frame = self.bounds;
    [self.view setNeedsLayout];
    [self.view layoutSubviews];


- (void)didMoveToWindow 
    [super didMoveToWindow];

    [self setNeedsLayout];
    [self layoutIfNeeded];
`

固定代码project

【讨论】:

感谢您的解决方案。我刚刚添加了 self.view.frame = self.bounds;在 layoutSubviews 中解决这个问题。似乎不需要其他方法。 但是在布局阶段发生时不应该自动设置正确的框架吗? 您必须在 addSubview 函数之后添加约束。它会自动解决。 你在说什么限制?我需要了解为什么它不会自动发生。您加载笔尖,然后约束传递应该接管 -> 布局传递 -> 显示传递。 您从 xib 加载附加视图 -> 将加载的视图作为子视图添加到您的视图(来自情节提要)。如果你想从 xib 加载视图 - 你必须注意容器的框架 medium.com/@brianclouser/…

以上是关于UIStackView 中等宽的自定义子视图的主要内容,如果未能解决你的问题,请参考以下文章

延迟加载 UICollectionViewCell 的自定义子视图

防止 UITableView 在自定义子视图处理触摸时滚动

iOS 视图上的自定义子视图有空插座

SwiftUI GeometryReader 不会在中心布局自定义子视图

IBOutlets/actions 和自定义子视图

如何将 UIView 插座连接到自定义子视图