【问题标题】:Resizing UITableViewCell content width automatically自动调整 UITableViewCell 内容宽度
【发布时间】:2011-03-22 10:49:53
【问题描述】:

我有一些代码可以创建一个带有滑块的表格单元格。它非常简单,并且在 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 上,slider-plus-images 内容的宽度小于 280,因此它不会一直走到尽头——它最终会短约 20 个像素。

在 iPad 上,同样的事情 - UISlider 的宽度会自动调整为距离单元格末尾约 20 个像素。

也许自动调整大小标志正在关注单元格不存在的accessoryView?我尝试将其显式设置为nil,但我认为它默认为nil,所以没有任何改变。

我希望此单元格的内容自动调整为单元格的“完整”宽度,无论设备和方向如何。有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: iphone ipad uitableview autoresize


    【解决方案1】:

    它完全按照您的描述工作。我倾向于认为这是iOS错误。在 iPad 上,当您创建新的 UITableViewCell 时,它的宽度设置为 320。硬编码(!)视图和内容视图。如果设置为UIViewAutoresizingFlexibleWidth,它不会正确调整大小。我将它设置为 view.frame.size.width/2,结果很有趣:在 iPhone 上是 160,在 iPad 上是 608!

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

    【讨论】:

    • 是的,看起来它第一次创建时总是 320
    • 这不是错误,contentMode 是错误的。见下文。
    【解决方案2】:

    有点晚了,但我今天找到了相同问题的解决方案,但是您需要创建一个自定义 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];,这将使子视图自动调整大小。
    • 如果您有自定义子视图(在您的自定义单元格中),您可以这样做
    • 在 layoutSubviews 上,文档声明“您不应直接调用此方法。”而是调用 setNeedsLayout
    • +1 用于覆盖 layoutSubviews、自定义子视图,而不是直接调用该方法。此外,当为表格使用“分组”显示时,您应该使用contentView.frame 而不是self.frame,因为self.frame 似乎返回表格的宽度,并且在分组模式下,单元格比表格窄. (请原谅我的 ObjC,我使用 MonoTouch 和 C#,所以调用不同。概念相同)。
    • 正如@cod3monk3y 所说——使用单元格时,您应该将内容放入contentView,而不是单元格本身。根据contentView 的边界调整大小。
    【解决方案3】:

    您应该能够告诉调整大小系统将对象“粘贴”到距右边缘固定距离的位置(调整大小不够远)。如果您尝试使用 IB,您可以创建一个调整宽度并固定在右侧的视图。

    你也设置了 UIViewAutoresizingFlexibleRightMargin 吗?

    【讨论】:

    • 我没有设置UIViewAutoresizingFlexibleRightMargin。你能解释一下如何以编程方式做到这一点吗?上面发布的代码是匿名的,但正是我现在所拥有的。
    【解决方案4】:

    将单元格的 contentMode 设置为 UIViewContentModeRedraw

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2011-02-22
      • 2015-07-07
      相关资源
      最近更新 更多