【问题标题】:Reasons for UITableViewCell UI inconsistencyUITableViewCell UI不一致的原因
【发布时间】:2015-10-07 01:47:36
【问题描述】:

大多数时候,当我的应用程序正常运行时,我的表格视图项如下所示:

但每隔一段时间,一个单元格(在初始加载时)看起来像这样:

您可以看到图像已调整大小,“发布者”标签已调整大小。

为什么会发生这种情况?相同的代码/故事板应该以相同的方式影响所有单元格吗?为什么有些人不按他们说的去做?

如果有帮助,当单元格加载错误时,我所要做的就是向上滚动,然后再次向下滚动,问题就解决了!!

这意味着图像或文字数量显然没有问题,只是 iPhone 出了问题吗?

感谢您的帮助!

【问题讨论】:

  • 你用过自动布局吗?
  • 约束是否正常,没有警告?当数据放入单元格时,它们能否应对大小变化?
  • 我认为约束是可以的。我正在使用自动布局。为什么向下滚动和备份可以解决问题。这不是说明数据本身没有问题吗?
  • @GregoryPeck 我想,它是因为图像的加载顺序而发生的,你是从互联网上加载的吗?还是在您的资源中?
  • @nyekimov 我从互联网异步加载图像,是的!

标签: ios iphone swift uitableview


【解决方案1】:

您是否使用图层蒙版来创建圆形图像?如果是,您会看到这种奇怪的行为,因为在 UITableView 为单元格分配正确的框架之前创建了图层蒙版,因此图层蒙版将具有不正确的框架。

【讨论】:

  • 将此代码放在表格视图单元格类中的layoutSubviews 方法中,因此掩码大小将具有正确的大小。
  • 如果这能解决我的问题,我将不胜感激!因此,在 layoutSubviews 函数中,我是否循环遍历 TableView 中的所有单元格并运行上述代码。或者 layoutSubviews 是否已经应用于每个单独的单元格?
  • layoutSubviews 方法是特定于表视图的吗?
  • 不,每个UIView 实例都有layoutSubviews 方法。当视图框架发生变化时将调用它。在这种情况下,您应该在表格视图单元格类中重写此方法。
  • 抱歉,您可能有点不耐烦了。我从未真正使用过表格视图单元格类,我只是在cellForRowAtIndexPath 中定义了所有内容。是否有必要创建单元类?如果是这样,我是否摆脱了cellForRowAtIndexPath
【解决方案2】:

我认为它的单元格出队问题。您的单元格无法计算单元格的正确高度。如果您使用自动布局,请尝试以下代码。希望它对你有用。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static YOUR_TABLEVIEW_CELL *sizingCell = nil;
    static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
    sizingCell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (sizingCell==nil)
    {
        sizingCell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [self configureFareIssueCell:sizingCell atIndexPath:indexPath];
    return [self calculateHeightForConfiguredSizingCell:sizingCell];
}

//assign all the lables & images here
- (void)configureFareIssueCell:(YOUR_TABLEVIEW_CELL* )cell atIndexPath:(NSIndexPath *)indexPath
{
    //e.g 
    cell.lbl.text=@"YOUR_TEXT";
    cell.imageView.image=[UIImage imageNamed:@"NAME_OF_YOUR_IMAGE"];
} 

- (CGFloat)calculateHeightForConfiguredSizingCell:(YOUR_TABLEVIEW_CELL *)sizingCell
{
    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height + 1.0f; // Add 1.0f for the cell separator height
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
    YOUR_TABLEVIEW_CELL   *cell =[tableView dequeueReusableCellWithIdentifier:@"YOUR_TABLEVIEW_CELL_IDENTIFIER"];
    if (cell==nil)
    {
        cell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [self configureFareIssueCell:cell atIndexPath:indexPath];

    return cell;
}

【讨论】:

  • 问题中是否有任何暗示可能表明您的答案与之相关? (请不要在代码 sn-ps 中使用印刷引号)
  • 另外,(正如它在标签中所说),我正在使用swift,我发现很难理解objective-c,因为我从未使用过它。您可以通过引用快速代码来解释的任何机会。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多