创建新的 tableView 条目时,约束不起作用
When creating new tableView entry the constraints don't work
我有一个使用 CoreData 的主从应用程序。一切都连接良好并按预期工作。添加新条目时,显示只有一个问题。
左边是带有条目的主视图,右边是详细视图,用户在其中输入新信息。
我有一个自定义 UITableViewCell
来处理格式设置。新条目的 titleLabel
由约束正确定位。然而,detailTextLabel
似乎并不关心约束,它只是从单元格的左上角开始(因此在 0,0 位置),因此位于 titleLabel
的顶部。
我做错了什么?
这是自定义 UITableViewCell 的自定义初始化程序:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
self.backgroundColor = [UIColor darkGrayColor];
self.textLabel.font = [Constants mainFontWithSize:16];
self.detailTextLabel.font = [Constants mainFontWithSize:12];
// correct default constraints
self.textLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[textLabel]-35-|" options:0 metrics:nil views:@{ @"textLabel": self.textLabel }]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[detailTextLabel]-35-|" options:0 metrics:nil views:@{ @"detailTextLabel": self.detailTextLabel }]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-7-[textLabel(19)]-(3)-[detailTextLabel(14)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:@{ @"textLabel": self.textLabel, @"detailTextLabel": self.detailTextLabel }]];
}
return self;
}
谢谢
您似乎在尝试为内置单元格样式的标签添加约束。
这不起作用的原因是因为它们是(public 还)内部标签,并且 Apple 的代码经过优化以在 Apple 认为标签获胜时从其 contentView 中删除其标签不需要。
当标签从其父视图中删除时,约束也会被删除。后来,当 Apple 将标签添加到 superView 时,您添加的约束影响了内置行为,因此它的标签现在错位了。
要么让 Apple 自行管理和布局其内置单元格样式,要么使用带有您自己的标签和约束的自定义单元格样式。
我有一个使用 CoreData 的主从应用程序。一切都连接良好并按预期工作。添加新条目时,显示只有一个问题。 左边是带有条目的主视图,右边是详细视图,用户在其中输入新信息。
我有一个自定义 UITableViewCell
来处理格式设置。新条目的 titleLabel
由约束正确定位。然而,detailTextLabel
似乎并不关心约束,它只是从单元格的左上角开始(因此在 0,0 位置),因此位于 titleLabel
的顶部。
我做错了什么?
这是自定义 UITableViewCell 的自定义初始化程序:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
self.backgroundColor = [UIColor darkGrayColor];
self.textLabel.font = [Constants mainFontWithSize:16];
self.detailTextLabel.font = [Constants mainFontWithSize:12];
// correct default constraints
self.textLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[textLabel]-35-|" options:0 metrics:nil views:@{ @"textLabel": self.textLabel }]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[detailTextLabel]-35-|" options:0 metrics:nil views:@{ @"detailTextLabel": self.detailTextLabel }]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-7-[textLabel(19)]-(3)-[detailTextLabel(14)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:@{ @"textLabel": self.textLabel, @"detailTextLabel": self.detailTextLabel }]];
}
return self;
}
谢谢
您似乎在尝试为内置单元格样式的标签添加约束。
这不起作用的原因是因为它们是(public 还)内部标签,并且 Apple 的代码经过优化以在 Apple 认为标签获胜时从其 contentView 中删除其标签不需要。
当标签从其父视图中删除时,约束也会被删除。后来,当 Apple 将标签添加到 superView 时,您添加的约束影响了内置行为,因此它的标签现在错位了。
要么让 Apple 自行管理和布局其内置单元格样式,要么使用带有您自己的标签和约束的自定义单元格样式。