4

我和其他人一样遇到了 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被自动调用:

在此处输入图像描述

有没有人有任何修复的想法?谢谢!

4

1 回答 1

3

我现在似乎已经在我的代码中解决了这个问题。首先确保在 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];
}
于 2013-12-01T19:46:22.507 回答