我可以阻止UITableViewCell自动调整其子视图吗?

时间:2009-08-13 18:00:42

标签: iphone cocoa-touch uitableview

我在每个单元格中都有UITableView个自定义背景图片。底部单元格具有更高的图像,其余部分,因为它包含阴影。这意味着我必须将一个部分中最后一个单元格的高度扩展到比正常高。

当我这样做时,UITableViewCell的内容看起来像是在细胞底部而不是中间(因为视觉细胞比实际细胞短)。有没有办法让我可以从顶部而不是中心定位我的内容,而当单元格成为底部单元格时(由于删除或其他),UITableViewCell不会调整它的大小?

将标签上的自动调整遮罩设置为具有静态顶部边界不起作用,也不会关闭单元格上的autoresizesSubviews

我还考虑过简单地让所有单元格高度相同并关闭背景图像上的clipsToBounds,除了背景图像是水平和垂直的可伸缩图像,并且需要能够根据细胞内容物的高度。

其他任何不涉及hackish方法的想法?

5 个答案:

答案 0 :(得分:6)

我遇到了类似的问题(see this question)。解决方案是覆盖我的自定义表格视图单元格类中的layoutSubviews而不执行任何操作

答案 1 :(得分:2)

在tableViewController中尝试 tableView:heightForRowAtIndexPath:。请记住将UITableViewDelegate作为协议包含在内。

查看Apple iPhone Reference Library: tableView:heightForRowAtIndexPath:了解限制以及可以返回的内容。

编辑: 好的,了解更多关于你的问题的尝试

-(BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}

答案 2 :(得分:0)

表视图中的底部单元格只是在视觉上被剪切,技术上没有调整大小,因为frame值在内部是相同的。

我认为你的意思是你希望你的文字与单元格的顶部垂直对齐,对吗?

如果是这样,您可以通过调整包含文本的UILabel的大小来实现此目的,使其具有与所包含文本相同的垂直大小,并确保标签与单元格的顶部齐平 - 或者尽可能接近如你所愿(用几个像素值的填充看起来更好)。

你怎么知道文字的大小?您可以在sizeWithFont:...上使用方便的NSString方法(从技术上讲,它不在原始类定义中,而是added later by UIKit)。以下是一些示例代码:

NSString *myString = @"lorem ipsum dolor yadda";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont 
                           constrainedToSize:textLabel.frame.size
                               lineBreakMode:textLabel.lineBreakMode];

textLabel.frame = CGRectMake(10, 10, /* Or whichever origin you want. */
                             textLabel.frame.size.width, myStringSize.height);

答案 3 :(得分:0)

我还没有找到这个的自动解决方案。我改为覆盖了几个函数(textLabeldetailTextLabelsetAccessoryView:)来使用我自己的标签,这些标签是我希望它们自动化的。

我还必须覆盖willTransitionToState:方法并深入研究实现细节,以便将添加/删除和删除确认按钮移动到我想要的位置。

答案 4 :(得分:0)

这是一篇很老的帖子,但我遇到了同样的问题。

覆盖layoutSubviews可能会隐藏问题,但它不会修复它,也不会在任何情况下都能正常工作。

我的猜测是,这里有几个使用相同的名称为自定义单元格添加了标签。这导致位置不正确的行为,直到滚动,因为存在名称冲突。这是我发现这个的地方。 dequeued UITableViewCell has incorrect layout until scroll (using autolayout)

重做我的IBOutlets,其名称不同于为我修复的标准标签。