Autolayout隐藏Image首次启动

时间:2014-02-25 16:11:14

标签: ios objective-c uitableview autolayout

我在使用xib文件创建的Custom TableViewCell中使用autolayout,它看起来像这样:

enter image description here

一切都像预期的那样工作并显示正确,但在向下滚动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解决方案是删除底部图像的底部约束并为底部图像设置修复高度!

2 个答案:

答案 0 :(得分:2)

您当前的约束设置将使底部UIImageView的高度为-1.5。

AutoLayout的第二条规则 - 你不能有否定数据!

您可以从错误消息中看到这一点。

从上到下(UITableViewCell)你有......

  • 差距为10。
  • 高度为75。
  • 43的差距。
  • 可变高度(这是大图像视图)
  • 差距为0。

这最多可达128个。

现在,您还有从顶部到底部的单元格总高度为126.5。

满足这些要求的唯一方法是将图像视图的变量高度设置为-1.5。 这不能完成它违反了AutoLayout的第二条规则。因此,它选择一个它认为可能有帮助的约束并将其删除。因此,您可能会获得0或其他图像视图高度。

您需要更改约束或使单元格高度为128。

答案 1 :(得分:0)

我在示例项目中复制了您的布局,我能够重现您问题的唯一方法是在cellForRowAtIndexPath中设置:

cell.translatesAutoresizingMaskIntoConstraints = NO;

如果您这样做,请尝试将其删除。我没有时间深入研究细节,以了解为什么这会导致布局过度约束。但总的来说,我认为一个好的经验法则是不要更改此默认值,因为表视图拥有单元格本身的布局。您只拥有内容的布局。