我在使用xib文件创建的Custom TableViewCell中使用autolayout,它看起来像这样:
一切都像预期的那样工作并显示正确,但在向下滚动TableView时我收到了很多警告信息:
无法同时满足约束条件。 可能至少下列列表中的一个约束是您不想要的约束。试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您看到您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) (
"<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>",
"<NSLayoutConstraint:0xc3c1dc0 V:|-(10)-[UIImageView:0xc396fc0] (Names: '|':UITableViewCellContentView:0xc396f20 )>",
"<NSLayoutConstraint:0xc3c1fc0 V:[UIImageView:0xc3b7700]-(0)-| (Names: '|':UITableViewCellContentView:0xc396f20 )>",
"<NSLayoutConstraint:0xc3c1ff0 V:[UIImageView:0xc396fc0]-(43)-[UIImageView:0xc3b7700]>",
"<NSAutoresizingMaskLayoutConstraint:0xc3bf8c0 h=--& v=--& V:[UITableViewCellContentView:0xc396f20(126.5)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>
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.
我认为以下部分很有意思:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xc3970d0 V:[UIImageView:0xc396fc0(75)]>
所以问题是我左边顶部的UIImageview的高度???我试图删除高度和许多其他的东西,但绝对注意为我工作....我能做什么?我希望左上角的UIImageView有一个固定的大小...
修改 也许问题可能是底部UIImageView是可选的,有时它是隐藏的,所以这可能导致警告......
我的守则的重要部分:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier1 = @"NewsCell";
GTNewsCustomCell *newsCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
NSString *bottomImage = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"boardnoteImage"];
if(bottomImage == (NSString *)[NSNull null] || bottomImage == nil || bottomImage.length == 0){
newsCell.bottomImage.hidden = YES;
newsCell.bottomImage.image = nil;
newsCell.bottomConstraint.constant = 0.0f;
[newsCell layoutIfNeeded];
} else {
newsCell.bottomConstraint.constant = 19.0f;
newsCell.bottomImage.hidden = NO;
[newsCell layoutIfNeeded];
[newsCell.contentView addSubview:newsCell.boardNoteImage];
}
newsCell.titleLabel.text = [[self.newsList objectAtIndex:indexPath.section]objectForKey:@"title"];
newsCell.messageText = [[self.newsList objectAtIndex:indexPath.section]objectForKey:@"previewMessage"];
NSString *authorImg = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"objectImage"];
return newsCell;
}
编辑2: 我做了一些更改,现在是单元格的高度计算:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *bottomImage = [[self.newsList objectAtIndex:indexPath.section] valueForKey:@"boardnoteImage"];
//Check if the bottom Image exists
if(bottomImage == (NSString *)[NSNull null] || bottomImage == nil || bottomImage.length == 0){
// if it not exists the cell should be smaller
return 128.0f;
}
//if the image exists the size should be 250
return 250;
}
编辑:3
最终现在可以使用了。我有两个解决方案。第一个是将Cell Height设置为148.0f,说实话我不知道为什么,也许我的UITextView有一些奇怪的插图?)。而secnd解决方案是删除底部图像的底部约束并为底部图像设置修复高度!
答案 0 :(得分:2)
您当前的约束设置将使底部UIImageView
的高度为-1.5。
AutoLayout的第二条规则 - 你不能有否定数据!
您可以从错误消息中看到这一点。
从上到下(UITableViewCell)你有......
这最多可达128个。
现在,您还有从顶部到底部的单元格总高度为126.5。
满足这些要求的唯一方法是将图像视图的变量高度设置为-1.5。 这不能完成它违反了AutoLayout的第二条规则。因此,它选择一个它认为可能有帮助的约束并将其删除。因此,您可能会获得0或其他图像视图高度。
您需要更改约束或使单元格高度为128。
答案 1 :(得分:0)
我在示例项目中复制了您的布局,我能够重现您问题的唯一方法是在cellForRowAtIndexPath
中设置:
cell.translatesAutoresizingMaskIntoConstraints = NO;
如果您这样做,请尝试将其删除。我没有时间深入研究细节,以了解为什么这会导致布局过度约束。但总的来说,我认为一个好的经验法则是不要更改此默认值,因为表视图拥有单元格本身的布局。您只拥有内容的布局。