我有一个UITableViewSubclass(样式:UITableViewCellStyleValue1),它具有一个自定义标签,该标签实际上是对普通textLabel
标签的替代。它应与普通textLabel
对齐,但宽度要到普通detailTextLabel
的左侧8点。我得到了预期的效果,但是当使用单元格时,抛出了无法同时满足约束的异常。
我不明白的是它为什么抱怨,没有明显的冲突。设置约束后调用[self layoutIfNeeded]可使异常静音。或者,降低配置尾随属性的约束的优先级(例如,UILayoutPriorityDefaultHigh
而不是默认的UILayoutPriorityRequired
)也会使异常静音,这显然是因为我通知自动布局引擎可以打破/忽略该约束。
我假设标准的UITableView实现可能奇怪地将textLabel
和textLabel
布局为某种方式,使得最初无法描述所描述的视图。例如,如果textLabel
实际上位于单元格的右侧,而detailTextLabel
位于左侧,那么我所描述的布局将是不可能的。
在这种情况下,“自动布局”何时生效。它是在想像之前跳枪并尝试布置东西吗?
没有使用情节提要或XIB。纯粹基于代码。
#import "EBTStoreTableViewCell.h"
@interface EBTStoreTableViewCell ()
@property (nonatomic, readonly, weak) UILabel *storeNameLabel;
@end
@implementation EBTStoreTableViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier];
if (self) {
self.textLabel.text = @" ";
self.detailTextLabel.text = @" ";
UILabel *storeNameLabel = [[UILabel alloc] init];
storeNameLabel.translatesAutoresizingMaskIntoConstraints = NO;
[storeNameLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
[self.contentView addSubview:storeNameLabel];
_storeNameLabel = storeNameLabel;
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.textLabel attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel attribute:NSLayoutAttributeBaseline relatedBy:NSLayoutRelationEqual toItem:self.textLabel attribute:NSLayoutAttributeBaseline multiplier:1.0f constant:0.0f]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:storeNameLabel attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.detailTextLabel attribute:NSLayoutAttributeLeading multiplier:1.0f constant:-8.0f]];
// [self layoutIfNeeded]; // doing this makes the issue go away
}
return self;
}
// Setters ommited
@end
这是我得到的异常消息:
2014-04-23 11:50:42.092 Application[32507:60b] 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: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 ==>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xde03a30 UILabel:0xde036b0.trailing == UITableViewLabel:0xde00c10.leading - 8>
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
最佳答案
您不应该使用textLabel
和detailTextLabel
进行混搭。由于它们的大小在内部进行管理,因此可能不受限制,并且可能会产生意外的结果。
您应该创建自己的标签,然后对它们施加约束。
从 UITableViewCell
的文档中:
创建单元格时,您可以自定义它们,也可以使用几种预定义的样式之一。预定义的单元格样式是最简单的选项。使用预定义的样式,单元格将提供其位置和样式固定的标签和图像子视图。您要做的就是提供文本和图像内容以进入那些固定视图。要使用具有预定义样式的单元格,请使用 initWithStyle:reuseIdentifier:
方法对其进行初始化,或者在Xcode中使用该样式配置该单元格。要设置单元格的文本和图像,请使用 textLabel
, detailTextLabel
和 imageView
属性。
如果要超越预定义的样式,则可以将子视图添加到单元格的 contentView
属性。添加子视图时,您有责任自己定位这些视图并设置其内容。
关于ios - 为什么UITableViewCell有自动布局约束冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23252900/