Ios 在特殊情况下,intrinsicContentSize会导致无限循环

Ios 在特殊情况下,intrinsicContentSize会导致无限循环,ios,autolayout,Ios,Autolayout,我创建了一个称为SimpleStackView的容器视图。想法很简单,任何子视图都堆叠在彼此的顶部。SimpleStackView的宽度决定其子视图的宽度,SimpleStackView的高度由其子视图的高度决定 我在LayoutSubview中这样做,我在每个子视图上调用sizeThatFits,并使用返回的高度将它们放在每个子视图的顶部。这些高度的总和还确定SimpleStackView的sizeThatFits覆盖和intrinsicContentSize覆盖返回的内容 我支持iOS 7,

我创建了一个称为SimpleStackView的容器视图。想法很简单,任何子视图都堆叠在彼此的顶部。SimpleStackView的宽度决定其子视图的宽度,SimpleStackView的高度由其子视图的高度决定

我在LayoutSubview中这样做,我在每个子视图上调用sizeThatFits,并使用返回的高度将它们放在每个子视图的顶部。这些高度的总和还确定SimpleStackView的sizeThatFits覆盖和intrinsicContentSize覆盖返回的内容

我支持iOS 7,因此无法使用UIStackView

我使用自动布局来布局我应用程序中的大部分内容。我的SimpleStackView在许多地方都可以正常工作,在这些地方,它的布局使用了其他视图旁边的AutoLayout(我依靠它的内部ContentSize来定义它的高度,没有高度约束),但在一种情况下,SimpleStackView放在UITableView中UITableViewCell的contentView中。在这种情况下,将触发无限循环。我不是自动布局大师。我可能遗漏了一些关于如何在AutoLayout中使用IntrinsicContentSizes的内容?这可能是什么情况?如何正确使用intrinsicContentSize,使其在所有情况下都能正常工作

SimpleStackView的代码相对较短;下面是完整的类实现:

@implementation SimpleStackView

@synthesize rowSpacing=_rowSpacing;

- (void)layoutSubviews
{
    [super layoutSubviews];

    [self sizeToFit];
    [self invalidateIntrinsicContentSize];

    CGFloat nextRowTop = 0;
    for (UIView *view in self.subviews)
    {
        CGSize size = [view sizeThatFits:CGSizeMake(self.bounds.size.width, view.bounds.size.height)];
        view.frame = CGRectMake(0, nextRowTop, self.bounds.size.width, size.height);
        nextRowTop += view.frame.size.height + self.rowSpacing;
    }
}

- (CGSize)sizeThatFits:(CGSize)size
{
    CGFloat sumOfHeights = 0;
    for (UIView *view in self.subviews) {
        sumOfHeights += [view sizeThatFits:CGSizeMake(size.width, view.bounds.size.height)].height;
    }
    CGFloat sumOfRowSpacings = MAX(0, (int)self.subviews.count - 1) * self.rowSpacing;
    return CGSizeMake(size.width, sumOfHeights + sumOfRowSpacings);
}

- (CGSize)intrinsicContentSize
{
    CGFloat intrinsicHeight = [self sizeThatFits:self.bounds.size].height;
    return CGSizeMake(UIViewNoIntrinsicMetric, intrinsicHeight);
}

// i tried this to fix the infinite loop; didnt work was still stuck in infinite loop
//- (void)setFrame:(CGRect)frame
//{
//    CGRect frameBefore = self.frame;
//    [super setFrame:frame];
//    if (NO == CGRectEqualToRect(frameBefore, frame))
//        [self invalidateIntrinsicContentSize];
//}

@end

编辑:我忘了提;导致无限循环的UITableCellView具有从contentView顶部到contentView底部的完整约束链。当我移除其中一个约束以断开链时,无限循环停止发生。我想保留这些约束,它们用于在行高很小时压缩多行UILabel(在UITableViewDelegate的heightForRowAtIndexPath中设置)。

您到底想做什么?我希望无限循环停止发生。我想回答我提出的问题;“如何正确使用intrinsicContentSize,使其在所有情况下都能正常工作?”@Pärserk,为什么不将Simplestack视图的所有子视图与自动布局一起放置?这将自动处理所有这些。嘿@Pärserk你找到解决方案了吗?因为我也有同样的问题