我正在 iOS7 中开发应用。我有一个TableViewController
,它的风格是分组的。
我成功实施了this解决方案,可以根据需要获得TableView
曲线。
编辑: - 我没有为单元格使用任何自定义类。我刚从nib添加了TableView
,并且默认使用了单元格。
实施的代码如下: -
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(tintColor)]) {
if (tableView == self.tblviwSample) {
CGFloat cornerRadius = 5.f;
cell.backgroundColor = UIColor.clearColor;
CAShapeLayer *layer = [[CAShapeLayer alloc] init];
CGMutablePathRef pathRef = CGPathCreateMutable();
CGRect bounds = CGRectInset(cell.bounds, 10, 0);
BOOL addLine = NO;
if (indexPath.row == 0 && indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
} else if (indexPath.row == 0) {
CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
addLine = YES;
} else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
} else {
CGPathAddRect(pathRef, nil, bounds);
addLine = YES;
}
layer.path = pathRef;
CFRelease(pathRef);
layer.fillColor = [UIColor colorWithWhite:1.f alpha:0.8f].CGColor;
if (addLine == YES) {
CALayer *lineLayer = [[CALayer alloc] init];
CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale);
lineLayer.frame = CGRectMake(CGRectGetMinX(bounds)+10, bounds.size.height-lineHeight, bounds.size.width-10, lineHeight);
lineLayer.backgroundColor = tableView.separatorColor.CGColor;
[layer addSublayer:lineLayer];
}
UIView *testView = [[UIView alloc] initWithFrame:bounds];
[testView.layer insertSublayer:layer atIndex:0];
testView.backgroundColor = UIColor.clearColor;
cell.backgroundView = testView;
}
}
}
此代码的效果 - See this - before selection
但是遇到一个问题,当我选择一个单元格时,它看起来很像this
我希望这个部分正确。任何想法都将不胜感激。
答案 0 :(得分:1)
我会使tableview更薄(从两侧减小宽度),然后实现你的外观,这样行不会在表视图的边缘之前结束,而是一直延伸到tableview的一侧。
换句话说 - 减少表视图宽度以匹配当前行宽并将该行保留为现在的出价(然后它将与tableview一样宽)。您的选择现在也不会那么宽。
或者,在选择后,您可以修改表格视图单元格,以便模仿某些自定义选择。这可能是通过改变单元格颜色直到用动画来翻转它。
希望有所帮助。
答案 1 :(得分:1)
今天也遇到了这个问题,而且这里有修复:
将以下代码添加到willDisplayCell的末尾:
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = cell.bounds;
maskLayer.path = pathRef;
cell.selectedBackgroundView.layer.mask = maskLayer;
CFRelease(pathRef);
答案 2 :(得分:0)
选择UITableViewCells
后,默认情况下,所有子视图的backgroundcolor
都会[UIColor clearColor]
,而单元格selectedBackgroundView
则会设置事物的外观。
在您的codeample中,您正在操纵bakcgroundview以获得圆角,但只要选择了一个单元格,此视图就会变为透明。我建议覆盖setSelected
,并在此处操作单元格子视图。
来自UITableViewCells
selectedBackgroundView
文档:
普通样式表中的单元格的默认值为nil (UITableViewStylePlain)和非零用于节组表 UITableViewStyleGrouped)。 UITableViewCell添加了这个值 仅在选择单元格时将属性作为子视图。它补充说 选定的背景视图作为背景正上方的子视图 view(backgroundView)如果它不是nil,或者在所有其他视图后面。 调用setSelected:animated:导致选定的背景视图 使用alpha淡入淡出来制作动画。