Ios UITableViewCell中的UITextView无法满足约束

Ios UITableViewCell中的UITextView无法满足约束,ios,objective-c,uitableview,uitextview,autolayout,Ios,Objective C,Uitableview,Uitextview,Autolayout,我正在我的项目中实现聊天。我从smileyborg的方法开始——使用动态表格单元格的自动布局(,)。但现在我必须使用UITextView来显示聊天信息,因为我必须检测URL,在文本中插入微笑图像,并检测文本中用户昵称的触碰,而且我知道的UILabel类型的类都不支持所有这些东西 问题是,如果使用相同的代码,UITextView不会自动正确调整大小。它确实可以调整大小,但我收到了很多这样的警告: "<NSLayoutConstraint:0x173cea60 V:[GGTextView:0x

我正在我的项目中实现聊天。我从smileyborg的方法开始——使用动态表格单元格的自动布局(,)。但现在我必须使用UITextView来显示聊天信息,因为我必须检测URL,在文本中插入微笑图像,并检测文本中用户昵称的触碰,而且我知道的UILabel类型的类都不支持所有这些东西

问题是,如果使用相同的代码,UITextView不会自动正确调整大小。它确实可以调整大小,但我收到了很多这样的警告:

"<NSLayoutConstraint:0x173cea60 V:[GGTextView:0xad34600(60)]>",
"<NSLayoutConstraint:0x172e8a10 V:[GGTextView:0xad34600]-(0)-|   (Names: '|':UITableViewCellContentView:0x172e43d0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x173cee80 h=--& v=--& V:[UITableViewCellContentView:0x172e43d0(82)]>",
"<NSLayoutConstraint:0x172e8990 V:|-(0)-[GGTextView:0xad34600]   (Names: '|':UITableViewCellContentView:0x172e43d0 )>"

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x173cea60 V:[GGTextView:0xad34600(60)]>
TableViewCell代码:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {

    [self layoutSubviews];
}
return self;
}

- (void)layoutSubviews {  

[super layoutSubviews];
[self.contentView setNeedsLayout];
[self.contentView layoutIfNeeded];
}

- (void)setupWithMessage:(ChatMessage*)message {
   // ... setting up attributed string here    

self.messageTextView.attributedText = messageText;

[self setNeedsUpdateConstraints];
[self updateConstraintsIfNeeded];
}
最后是my UITextView子类基于内容高度创建高度约束的代码:

@implementation GGTextView

- (void)layoutSubviews
{
    [super layoutSubviews];

    [self setNeedsUpdateConstraints];
}

- (void)updateConstraints
{
    CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];

    if (!self.heightConstraint) {
        self.heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
        [self addConstraint:self.heightConstraint];
    }

    self.heightConstraint.constant = size.height;
    [super updateConstraints];
}

您是使用interface builder还是从代码实例化视图?如果使用IB,可以增加要快速保持的约束的优先级,并降低可在调整视图大小时调整的约束的优先级。另外,尝试将可以调整的设置为>=或我使用自定义UITextView时遇到了同样的问题,该自定义UITextView使用灵活的高度UITableViewCell设置高度约束。我发现UITextView通常不能很好地与
systemLayoutFittingSize
配合使用,即使使用自定义高度约束作为它的
intrinsicContentSize
。大多数情况下,它只是返回了错误的高度并弄乱了UITableViewCell的自动调整大小约束

我找到的唯一解决方案是不使用自定义文本视图(带约束),而是手动计算单元格的高度。UITextView的边应具有与其superview的约束。为了计算UITextView的高度,我添加了textView内容并使用

CGFloat textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height

由此,您应该能够计算单元格的其余高度。

您可以尝试更改UITextView上相对于单元格中其他对象的抗压优先级

我正在使用界面生成器。嗯,我没有那么多限制。“表视图”单元格仅包含TextView。我只有将TextView固定到单元格的contentView的约束,一个用于压缩阻力的约束和我在代码中添加的高度约束。所以它们都是必需的。单元格中除了UITEXTVIEW之外没有其他对象。实际上,我在没有任何手动计算的情况下成功地做到了这一点。稍后我会在这里发布解释。@Spail,我想知道你在没有人工计算的情况下是如何做到的。您可以发布您的解决方案吗?@Spail-我也对您的解决方案感兴趣。@如果可以,请发布您的解决方案。向UITextView添加宽度约束,并在代码中进行设置。在我的例子中,错误在于没有在正确的时间为UITextView指定宽度。
CGFloat textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height