本文介绍了为什么UITableViewCell中具备自动布局约束冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UITableViewSubclass(样式:UITableViewCellStyleValue1),有一个自定义标签基本上是正常的为textLabel 标签的替代品。应该留下对齐正常为textLabel ,但有一个宽度结束8点到正常的左 detailTextLabel 。我得到预期的效果,但是当使用的细胞,一个异常被抛出自己无法同时满足的约束。

我不明白的是为什么它抱怨,也没有明显的冲突。调用[自我layoutIfNeeded]建立约束条件之后,沉默异常。另外,降低了配置尾随产权约束的优先级(例如, UILayoutPriorityDefaultHigh 而不是默认的 UILayoutPriorityRequired )也沉默异常,显然是因为我通知自动布局引擎,它的好,打破/忽略约束。

我假设的标准实施的UITableView奇怪,也许勾画出为textLabel 为textLabel 在一个时尚的使得它最初无法描述描述的视图。例如,如果为textLabel 实际上放置在小区的右侧和 detailTextLabel 放置在左侧,那么我所描述的布局是不可能的。

在没有自动布局生效,在此方案的情况下。难道是偷步并尝试之前,它应该布局的东西呢?

正在使用的任何故事板或XIBs。纯粹code为主。

 #进口EBTStoreTableViewCell.h@interface EBTStoreTableViewCell()
@属性(非原子,只读,弱)的UILabel * storeNameLabel;
@结束@implementation EBTStoreTableViewCell - (ID)initWithStyle:(UITableViewCellStyle)风格reuseIdentifier:(* NSString的)reuseIdentifier
{
    自= [超级initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier];
    如果(个体经营){
        self.textLabel.text = @;        self.detailTextLabel.text = @;        *的UILabel = storeNameLabel [的UILabel的alloc]初始化];
        storeNameLabel.translatesAutoresizingMaskIntoConstraints = NO;
        [storeNameLabel setContentCom pressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizo​​ntal];
        [self.contentView addSubview:storeNameLabel];
        _storeNameLabel = storeNameLabel;        [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel属性:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.textLabel属性:NSLayoutAttributeLeading乘数:1.0F常数:0.0];
        [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel属性:NSLayoutAttributeBaseline relatedBy:NSLayoutRelationEqual toItem:self.textLabel属性:NSLayoutAttributeBaseline乘数:1.0F常数:0.0];        [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel属性:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.detailTextLabel属性:NSLayoutAttributeLeading乘数:1.0F常数:-8.0f]];// [自layoutIfNeeded] //这样做使问题消失
    }
    返回自我;
}//二传手ommited@结束

这异常消息我得到:

  2014年4月23日11:50:42.092应用[32507:60B]无法同时满足约束条件。
    大概在以下列表中的约束条件中的至少一个是一个你不想要的。试试这个:(1)看一下每个约束和揣摩,你不要指望; (2)找到code,它增加了不必要的约束或限制并修复它。 (注:如果你看到你不明白NSAutoresizingMaskLayoutConstraints,请参阅文档UIView的财产translatesAutoresizingMaskIntoConstraints)

    &所述; NSLayoutConstraint:0xde03910的UILabel:0xde036b0.leading ==的UILabel:0xde00590.leading>中,
    &所述; NSLayoutConstraint:0xde03a30的UILabel:0xde036b0.trailing == UITableViewLabel:0xde00c10.leading - 8>中,
    < NSAutoresizingMaskLayoutConstraint:0xde01920 H = - &安培; V = - &放大器;的UILabel:0xde00590.midX ==>中,
    &所述; NSAutoresizingMaskLayoutConstraint:0xde1de50 H = - &放大器; V = - &放大器; H:[的UILabel:0xde00590(0)]>中,
    < NSAutoresizingMaskLayoutConstraint:0x17f50a10 H = - &安培; V = - &安培; UITableViewLabel:0xde00c10.midX ==>中
)将试图打破约束恢复
&所述; NSLayoutConstraint:0xde03a30的UILabel:0xde036b0.trailing == UITableViewLabel:0xde00c10.leading - 8是氢。打破objc_exception_throw赶上这在调试器。
在UIView的的UIConstraintBasedLayoutDebugging类别中列出的方法<的UIKit / UIView.h>也可能是有帮助的。


解决方案

您应该不能混合使用匹配为textLabel detailTextLabel 。因为它们的大小在内部管理,可能会产生意想不到的结果,这些不能被限制。

您应该创建自己的标签,然后放在他们的约束。

从文档的 的UITableViewCell

这篇关于为什么UITableViewCell中具备自动布局约束冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 03:30