Cell UITableCellView顶部的阴影

时间:2011-11-15 23:34:57

标签: iphone uitableview shadow

我想知道是否有人知道如何获得像截图中的那样的shadaow效果。对我来说,看起来阴影效果是通过在上面的单元格底部和下面单元格的顶部有一个阴影来创建的。

我可以使用下面的代码从上面的单元格中创建一个,但无法弄清楚如何在下面的单元格上进行操作,因为它没有显示出来就好像单元格按照相反的顺序呈现z指数。

self.layer.shadowOffset = CGSizeMake(0, 2);
self.layer.shadowColor = [[UIColor blackColor] CGColor];
self.layer.shadowRadius = 2;
self.layer.shadowOpacity = 0.5;

CGFloat top = self.layer.bounds.origin.y;
CGFloat left = self.layer.bounds.origin.x;
CGFloat width = self.layer.bounds.size.width;

CGRect shadowFrame = CGRectMake(left, top, width, 44);
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
self.layer.shadowPath = shadowPath;

任何建议都非常感谢。

Things http://www.purplesmash.com/images/Things.jpg

3 个答案:

答案 0 :(得分:0)

您可能需要通过将阴影绘制为已检查单元格的一部分而不是在周围单元格上设置阴影属性来执行此操作。

我是通过添加一个或两个CAGradientLayers作为已检查单元格contentView.layer的子项来实现的。

答案 1 :(得分:0)

我根据月光的建议对此进行了编辑。当一个单元格需要我调用该方法时,我将该代码放入方法addInnerTopShadow中。我添加了另一个方法addInnerBottomShadow,它放在底部的阴影中。

我在drawRect方法中调用这些方法,当我想在状态之间切换时,我调用方法:

[cell setNeedsDisplay];

这允许我在不执行

之类的操作的情况下切换单元格的状态
[self.tableView reloadData];

正如方法所示,我有外阴影方法会在第一个和最后一个单元格上留下阴影,但这是另一个问题并且已经多次回答。我现在的应用程序正是我想要的。谢谢Rob和Moonlight。

-(void)addInnerBottomShadow
{   
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Creating path which will hold our hollow rectangle
    CGMutablePathRef path = CGPathCreateMutable();

    CGPathAddRect(path, NULL, CGRectMake(0, 44, 480, 80));
    CGPathAddRect(path, NULL, CGRectMake(0, 54, 480, 96));

    // Saving current graphics context state
    CGContextSaveGState(context);

    // Configuring shadow
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 6.0f, [[UIColor blackColor] CGColor]);

    // Adding our path
    CGContextAddPath(context, path);  

    // Configure hollow rectangle fill color
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

    // Fill rectangle and keep hollow part transparent
    CGContextEOFillPath(context);
    CGContextClipToRect(context, self.bounds);

    // Restore graphics context
    CGContextRestoreGState(context);
}

-(void)addInnerTopShadow
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(-8.0f, -8.0f, 336.0f, 96.0f));
    CGPathAddRect(path, NULL, CGRectMake(-5.0f, 0.0f, 330.0f, 80.0f));

    // Saving current graphics context state
    CGContextSaveGState(context);

    // Configuring shadow
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 7.0f, [[UIColor blackColor] CGColor]);

    // Adding our path
    CGContextAddPath(context, path);  

    // Configure hollow rectangle fill color
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

    // Fill rectangle and keep hollow part transparent
    CGContextEOFillPath(context);
    CGContextClipToRect(context, self.bounds);

    // Restore graphics context
    CGContextRestoreGState(context);
}

答案 2 :(得分:0)

使用CoreGraphics绘制时创建空心矩形(正确对齐空心部分覆盖您的单元格可见视图)并为上下文设置阴影 - 这将为您节省性能。

<强>更新
我在我的单元drawRect:方法

中尝试了这个
// Creating path which will hold our hollow rectangle
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(-8.0f, -8.0f, 336.0f, 96.0f));
CGPathAddRect(path, NULL, CGRectMake(-5.0f, 0.0f, 330.0f, 80.0f));

// Saving current graphics context state
CGContextSaveGState(context);

// Configuring shadow
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 6.0f, 
                            [[UIColor blackColor] CGColor]);

// Adding our path
CGContextAddPath(context, path);  

// Configure hollow rectangle fill color
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

// Fill rectangle and keep hollow part transparent
CGContextEOFillPath(context);

// Restore graphics context
CGContextRestoreGState(context);

当然,额外的改进将在初始化或在此方法中通过条件CGMutablePathRef path预先计算if(path == NULL)。颜色也可以保留。如果这应该是您的单元格更新的最后一行,那么您可能不需要保存上下文状态。