iOS 7 UITableViewCell 剪辑暂时

Posted

技术标签:

【中文标题】iOS 7 UITableViewCell 剪辑暂时【英文标题】:iOS 7 UITableViewCell clips TEMPORARILY 【发布时间】:2013-10-08 13:06:08 【问题描述】:

UITableViewCell 裁剪到它的边界时,我遇到了和其他人一样的问题。正如其他人正确指出的那样,单元格的 contentView 有一个新的超级视图。所以我这样做了:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSString *cellIdentifier = @"HomeTableViewCell";
    ItemCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(!cell)
    
        cell = [[ItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
       //add views here as subviews to cell.contentView. Set them tags and retrieve later.
    

    cell.clipsToBounds  = FALSE;
    cell.layer.masksToBounds = FALSE;
    cell.contentView.clipsToBounds = FALSE;
    cell.contentView.layer.masksToBounds = FALSE;
    cell.contentView.superview.clipsToBounds = FALSE;
    cell.contentView.superview.layer.masksToBounds = FALSE;

    [self loadCell:cell inTable:tableView atIndexPath:indexPath];

    return cell;

loadCell: inTable: atIndexPath: 按标签检索单元格的子视图并加载正确的内容。这工作正常。没有其他提及clipToBoundslayer.masksToBounds。但是:当我重新加载选定的单元格时,它会暂时剪辑到边界,然后它会点击上面的代码并正确处理。所以在大约 1-2 秒内,我将单元格剪掉了。这就是ItemCell 内部发生的事情。我刚刚创建了这个类,看看是什么将 clipToBounds 属性变为 TRUE。

@implementation ItemCell

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    if((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]))
    
        [self addObserver:self forKeyPath:@"layer.masksToBounds"    options:NSKeyValueObservingOptionNew context:nil];
        [self addObserver:self forKeyPath:@"clipsToBounds"          options:NSKeyValueObservingOptionNew context:nil];
    

    return self;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    NSNumber *nr = [change objectForKey:@"new"];
    if(nr.intValue)
    
        self.clipsToBounds = FALSE;        // STAY FALSE!!
        self.layer.masksToBounds = FALSE;
    

即使当它们变为 TRUE 时我将它们设为 FALSE ,我仍然会在剪裁/未剪裁之间存在差距。它只是更小。这在 ios6 上没有发生。这是 clipsToBounds 属性变为 TRUE 时的堆栈跟踪,您可以看到 CALayer setMasksToBounds 被自动调用:

有没有人知道任何修复方法?谢谢!

【问题讨论】:

我想我遇到了类似的问题。 如果您找到任何解决方案,请告诉我。到目前为止我一无所获,我有很多项目要处理,那个小故障被经理宣布为“可接受”,所以我不再处理它了。但我还是很好奇。 【参考方案1】:

我现在似乎已经在我的代码中解决了这个问题。首先确保在 Interface Builder 中设置了关于剪辑等的所有内容。然后似乎需要以下代码的全部或部分组合:

tableView:cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    //ios7 hacks
    [cell.contentView.superview setClipsToBounds:NO];
    [cell.contentView setClipsToBounds:NO];
    [cell setClipsToBounds:NO];
    return cell;

tableView:willDisplayCell:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

    //ios 7 cell background fix
    [cell.contentView.superview setClipsToBounds:NO];
    [cell.contentView setClipsToBounds:NO];
    [cell setClipsToBounds:NO];
    [cell setBackgroundColor:[UIColor clearColor]];
    //ios 7 content clipping fix
    [cell.contentView.superview setClipsToBounds:NO];
    [cell.contentView setClipsToBounds:NO];
    [cell setClipsToBounds:NO];

【讨论】:

感谢您的回复。我尝试使用“willDisplayCell”确实对此寄予厚望,但不幸的是它也没有用。 另一件可能适用的事情是我最终关闭了动画 - 只使用 reloadData 而不是 beginUpdatesendUpdates。显然不是一个理想的解决方案! 我正在重新加载 2 个单元格。之前选择的一个和新选择的一个。当您想要执行更多操作并立即为它们设置动画时,使用开始和结束更新......比如删除一行,更新另一行并插入另一行,而不是为每件事设置动画。我会尝试使用 'UITableViewCellAnimationNone' 但 AFAIK 仍然涉及一些动画(在有关表格的 WWDC 视频中看到了这一点。)谢谢!

以上是关于iOS 7 UITableViewCell 剪辑暂时的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 UITableViewCell 自动布局

UITableViewCell 自定义CG绘制iOS 7

ios 7 uitableviewcell 绘图更改

iOS 7 中具有 UITextView 高度的 UITableViewCell?

以编程方式为 UITableViewCell 设置 LayoutMargins - iOS 7 替代方案

如何在 UITableViewCell 后台实现实时 iOS 7 模糊效果