如何在Iphone +上的表视图自定义单元格的左上角和右上角

时间:2017-02-22 07:58:56

标签: ios objective-c iphone

如何在表视图自定义单元格的左上角和右上角处转角。我编写以下代码,它在iphone 6,5,7上工作正常。但是在Iphone 6 +,7+上,它看起来像是给定的屏幕。

我的代码是----

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomeCell"];
 if (indexPath.row == 0) {        
        UIBezierPath *maskPath = [UIBezierPath
                                  bezierPathWithRoundedRect:cell.contantsView.bounds
                                  byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                  cornerRadii:CGSizeMake(4, 4)
                                  ];

        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = cell.bounds;
        maskLayer.path = maskPath.CGPath;
        cell.contantsView.layer.mask = maskLayer;
        cell.contantsView.layer.masksToBounds = YES;

    }


    return cell;
}

我的屏幕看起来像 - : enter image description here

它这个屏幕我只有第一个和最后一个单元格的半径。中心细胞看起来很好。我想看所有单元格宽度相同。

1 个答案:

答案 0 :(得分:0)

问题是,当cellForRowAtIndexPath被调用时,cell.contentView.bounds(我假设您的contantsView在其中)与cell.bounds不同。在使用frame的{​​{1}}设置图层的bounds时,但在为面具创建contantsView时,您使用的是UIBezierPath } bounds本身。这些不一样(至少在cell时)。

所以,这表明了一些可能的修复方法:

  • 在定义贝塞尔曲线路径时,简单的修复是cellForRowAtIndexPath而不是cell.bounds。您将cell.contantsView.bounds用于形状图层的CGRect,而另一个用于同一形状图层的path。你真的应该对两者使用相同的frameCGRect不会遇到这种奇怪的大小问题。

  • 调用cell.bounds后,单元格frame的{​​{1}}会发生变化。因此上述修复工作恰好起作用,因为contentView不会改变,而cellForRowAtIndexPath(因此可能是您的cell.bounds)也会改变。

    正确的解决方法是,你真的应该将图层的掩蔽放在contentView中,用于你正在屏蔽的那个视图。 (顺便说一句,如果您更改设备上的方向,以及可能会更改contantsView尺寸的任何其他内容,这也将确保设置适当的蒙版。)

    如果您不想为layoutSubviews继承子类并为此实现contentView,理论上,您可以将屏蔽的背景颜色放在单元格本身上,而不是放在{{1}上},并在contantsView中实施layoutSubviews。 (坦率地说,无论如何,这可能是应用此背景的正确视图。)但是无论在什么视图中应用背景颜色,视图角落的遮蔽应该真正发生在contantsView