如何在Iphone +上仅将表格视图自定义单元格的左上角和右上角半径转角
Posted
技术标签:
【中文标题】如何在Iphone +上仅将表格视图自定义单元格的左上角和右上角半径转角【英文标题】:How to corner radius only top left and top right of table view custom cell on Iphone + 【发布时间】:2017-02-22 07:58:56 【问题描述】:如何仅在表格视图自定义单元格的左上角和右上角转角半径。我编写了以下代码,它在 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;
我的屏幕看起来像--:
这个屏幕我只有第一个和最后一个单元格的角半径。中心单元看起来不错。我想看所有单元格的宽度都一样。
【问题讨论】:
how to set cornerRadius for only bottom-left,bottom-right and top-left corner of a UIView?的可能重复 不,我有不同的场景,请仔细阅读。 【参考方案1】:问题在于,当调用 cellForRowAtIndexPath
时,cell.contentView.bounds
(我假设您的 contantsView
在其中)与 cell.bounds
不同。当您使用contantsView
的bounds
设置图层的frame
时,但在为您的蒙版创建UIBezierPath
时,您使用的是cell
本身的bounds
。这些是不一样的(至少在cellForRowAtIndexPath
的时候)。
因此,这表明了一些可能的修复方法:
在定义贝塞尔路径时,简单的修复方法是使用cell.bounds
而不是cell.contantsView.bounds
。您将一个CGRect
用于形状层的path
,另一个用于同一形状层的frame
。你真的应该为两者使用相同的CGRect
,并且cell.bounds
不会遇到这个奇怪的大小问题。
在调用cellForRowAtIndexPath
后,单元格的contentView
的frame
会发生变化。所以上面的修复恰好起作用,因为cell.bounds
没有改变,而contentView
(因此很可能是你的contantsView
)会。
正确的解决方法是,您确实应该将图层的遮罩放在layoutSubviews
中,以用于您要遮罩的视图。 (顺便说一句,如果您更改设备上的方向以及可能更改contentView
尺寸的任何其他内容,这也将确保正确设置蒙版。)
如果您不想麻烦将contantsView
子类化并为此实现layoutSubviews
,理论上,您可以将蒙版背景颜色放在单元格本身上,而不是contantsView
上,并实现@987654350 @在CustomeCell
。 (坦率地说,无论如何,这可能是应用此背景的正确视图。)但是在应用背景颜色的任何视图中,视图角的遮罩应该在其layoutSubviews
中真正发生。
【讨论】:
以上是关于如何在Iphone +上仅将表格视图自定义单元格的左上角和右上角半径转角的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:如何在自定义单元的动态数量上管理 UITextfield 委托方法