iOS7中奇怪的UITableViewCell选择

时间:2014-01-24 09:21:02

标签: ios uitableview ios7

我正在 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

我希望这个部分正确。任何想法都将不胜感激。

3 个答案:

答案 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淡入淡出来制作动画。