如何在表视图自定义单元格的左上角和右上角处转角。我编写以下代码,它在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;
}
它这个屏幕我只有第一个和最后一个单元格的半径。中心细胞看起来很好。我想看所有单元格宽度相同。
答案 0 :(得分:0)
问题是,当cellForRowAtIndexPath
被调用时,cell.contentView.bounds
(我假设您的contantsView
在其中)与cell.bounds
不同。在使用frame
的{{1}}设置图层的bounds
时,但在为面具创建contantsView
时,您使用的是UIBezierPath
} bounds
本身。这些不一样(至少在cell
时)。
所以,这表明了一些可能的修复方法:
在定义贝塞尔曲线路径时,简单的修复是cellForRowAtIndexPath
而不是cell.bounds
。您将cell.contantsView.bounds
用于形状图层的CGRect
,而另一个用于同一形状图层的path
。你真的应该对两者使用相同的frame
,CGRect
不会遇到这种奇怪的大小问题。
调用cell.bounds
后,单元格frame
的{{1}}会发生变化。因此上述修复工作恰好起作用,因为contentView
不会改变,而cellForRowAtIndexPath
(因此可能是您的cell.bounds
)也会改变。
正确的解决方法是,你真的应该将图层的掩蔽放在contentView
中,用于你正在屏蔽的那个视图。 (顺便说一句,如果您更改设备上的方向,以及可能会更改contantsView
尺寸的任何其他内容,这也将确保设置适当的蒙版。)
如果您不想为layoutSubviews
继承子类并为此实现contentView
,理论上,您可以将屏蔽的背景颜色放在单元格本身上,而不是放在{{1}上},并在contantsView
中实施layoutSubviews
。 (坦率地说,无论如何,这可能是应用此背景的正确视图。)但是无论在什么视图中应用背景颜色,视图角落的遮蔽应该真正发生在contantsView
。