自动调整UITableViewCell内容宽度

13

我有一些代码,创建了一个带滑块的表格单元格。它在iPhone上很容易实现并且可以调整大小。这里稍微对它进行了匿名处理:

UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Foo"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
CGRect contentViewFrame = cell.contentView.frame;
CGRect sliderFrame = CGRectMake(10, 0, 280, contentViewFrame.size.height);
UISlider* slider = [[UISlider alloc] initWithFrame:sliderFrame];
UIImage* minimumImage = [UIImage imageNamed:@"min.png"];
UIImage* maximumImage = [UIImage imageNamed:@"max.png"];
slider.minimumValueImage = minimumImage;
slider.maximumValueImage = maximumImage;
slider.value = 0.5f;
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:slider];
[slider release];
当然,这个尺寸对于iPad不正确。所以我的第一个想法是将`autoresizingMask`属性设置为`UIViewAutoresizingFlexibleWidth`。问题解决了,对吗?不,现在在iPhone上,滑块加图片内容的宽度小于280,所以它不会完全延伸到末尾——最终会短20个像素。
在iPad上也是同样的问题——UISlider的宽度会自动调整为比单元格末端短大约20个像素。
也许自动调整大小标志正在关注单元格的不存在的`accessoryView`?我试图将其明确设置为`nil`,但我认为默认情况下它是`nil`,所以没有任何改变。
我希望这个单元格的内容可以自动调整大小,使其成为单元格的“完整”宽度,无论设备和方向如何。有简单的方法可以实现吗?
4个回答

10

它的运作方式完全符合你所描述的。我倾向于认为这是iOS的一个bug。在iPAD上,当你创建新的UITableViewCell时,它的宽度被硬编码(!)为320,即view和contentView都是这样设置的。如果将其设置为UIViewAutoresizingFlexibleWidth,它不会正确地调整大小。我曾将其设置为view.frame.size.width/2,结果很有趣:在iPhone上是160,在iPad上是608!

最终我手动调整了我的单元格及其内容。


1
是的,看起来它在第一次创建时总是320。 - onmyway133
这不是一个 bug,只是 contentMode 错误了。请参见下面。 - Steven Fisher

6

可能有点晚了,但我今天找到了相同问题的解决方案,但您需要创建自定义UITableViewCell。然后您可以重写该函数

- (void) layoutSubviews
{
    [dateLabel setFrame:CGRectMake(10.f, 16.f, 80.f, 12.f)];
    [textLabel setFrame:CGRectMake(106.f, 16.f, contentView.frame.size.width-105.f + 1.f, 12.f)];
}

在该函数中,self.frame.size.width 是实际宽度。
而且它也适用于设备的旋转。

你不需要手动设置那些子视图的框架。你只需要在其中调用 [super layoutSubviews];,这将使子视图自动正确调整大小。 - Hlung
1
如果您有自定义子视图(在自定义单元格中),则需要执行此操作。 - Authman Apatira
1
在layoutSubviews中,文档说明:“您不应直接调用此方法。”而是调用setNeedsLayout。 - Max MacLeod
1
重写layoutSubviews、自定义子视图并不直接调用该方法,这是一个好习惯。此外,在使用表格的“分组”显示时,应该使用contentView.frame而不是self.frame,因为self.frame似乎返回表格的宽度,在分组模式下,单元格比表格窄。 (抱歉我的ObjC,我使用MonoTouch和C#,所以调用不同。概念是相同的)。 - cod3monk3y
1
正如@cod3monk3y所说,当使用单元格时,您应该将内容放在contentView中,而不是单元格本身。根据contentView的边界进行调整大小。 - nielsbot

3

将您的单元格的contentMode设置为UIViewContentModeRedraw


3
您应该能够告诉调整大小系统从右侧边缘固定对象的距离(它没有缩放得足够远)。如果您在IB中进行实验,可以创建一个在宽度上调整大小并固定在右侧的视图。
您是否也设置了UIViewAutoresizingFlexibleRightMargin?

我没有设置UIViewAutoresizingFlexibleRightMargin。你能详细解释一下如何在程序中实现吗?上面发布的代码已经匿名化,但正是我现在拥有的。 - Shaggy Frog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接