在 UICollectionViewCell 的情况下无法同时满足约束

Posted

技术标签:

【中文标题】在 UICollectionViewCell 的情况下无法同时满足约束【英文标题】:Unable to simultaneously satisfy constraints in case of UICollectionViewCell 【发布时间】:2014-11-26 11:08:04 【问题描述】:

我正在使用 iCarousel 来实现封面流程。我在 iCarousel 数据源方法中为其提供视图,如下所示:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index   reusingView:(UIView *)view


    if(!view) 
        view = [[SDHotOnThumbView alloc]initWithFrame:CGRectMake(0, 0,  kHotOnThumbViewWidth, kHotOnThumbViewHeight)];
        view.contentMode = UIViewContentModeScaleAspectFit;
    
    [((SDHotOnThumbView*)view) setData:[self.dataArray objectAtIndex:index]];
    return view;

setData 方法除了在 SDHotOnThumbView 实例中设置标签的文本,并为其中的图像视图启动图像下载之外,还调用了方法 updateLabelLayoutWithAttributedText,该方法在 SDHotOnThumbView 类中实现如下:

-(void)updateLabelLayoutWithAttributedText:(NSMutableAttributedString*) labelString

    float height = [self heightOfAttributedText:labelString  width:self.frame.size.width];
    self.descriptionLabel.translatesAutoresizingMaskIntoConstraints = NO;
    //self.descriptionLabel.preferredMaxLayoutWidth = self.frame.size.width;
    NSDictionary *viewsDict = @@"desclabel":self.descriptionLabel;
    NSArray *constraintsH = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0- [desclabel]-0-|" options:0 metrics:nil views:viewsDict];
    [self addConstraints:constraintsH];
    NSArray *constraintsV = [NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:[desclabel(==%f)]-10-|", height]
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDict];
    [self addConstraints:constraintsV];


iCarousel 回收视图,如果回收视图为零,我必须分配一个视图,并在每次轮播请求给定索引处的视图时配置它。根据属性字符串的大小,在我附加的第二种方法中,我用新的高度更新标签的垂直约束,以便根据它包含的数据调整标签的大小。视图布局很好,除了我得到 .例如,我得到

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.     Try this: (1) look at each constraint and try to figure out which you don't expect; (2)  find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7b82f330 V:[UILabel:0x7d861820'SanDisk Cruzer Blade USB  ...'(51.2)]>",
    "<NSLayoutConstraint:0x7d862df0 V:[UILabel:0x7d861820'SanDisk Cruzer Blade USB ...'(65.6)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7d862df0 V:[UILabel:0x7d861820'SanDisk Cruzer Blade USB  ...'(65.6)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in  the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.

记录标签的计算高度,我可以看到,当单元格从集合视图中删除并为集合视图中的某些不同索引重新添加时,它可能会保持其旧高度,并尝试添加一个新的垂直约束,打破了以前的约束。我什至尝试从视图中删除所有标签约束,并在每次调用集合数据时添加,但我在 Xcode 中看到了同样的情况,即使一切似乎都按预期工作。我该如何处理这些 Xcode 警告,或者如果布局符合要求就可以了。

【问题讨论】:

【参考方案1】:

不知何故,您在标签中双重插入了 2 个不同的高度,第一个高度为 51.2,第二个高度为 65.6。请再次检查您的代码。

【讨论】:

是..每次都会添加与高度相关的约束,因为每个可见单元格都会调用 setData 方法,从而导致添加具有新高度的约束。 尝试删除旧约束或删除标签:[label removeFromSuperview],然后再添加新约束。

以上是关于在 UICollectionViewCell 的情况下无法同时满足约束的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionViewCell 中更新 UITableView

如何在 UICollectionViewCell 中添加 UICollectionView?

如何在 UICollectionViewCell 上设置 UILabel?

UICollectionViewCell 边框/阴影

如何在 iOS 7 中刷新 UICollectionViewCell?

UICollectionviewcell 中未显示数据?