将背景渐变应用于Grouple表格单元格

时间:2009-12-30 09:00:50

标签: iphone objective-c uitableview

我正在使用以下代码为UITableViewCell创建渐变背景。虽然这适用于普通表格单元格,但渐变仅出现在分组表格单元格的左右角落。就好像然后应用渐变一样,细胞被绘制在它上面。

有人建议修改代码,这对分组表格单元格有效吗?或者有一种完全不同的方式吗?

- (void)drawRect:(CGRect)rect {
CGContextRef c = UIGraphicsGetCurrentContext();

CGGradientRef myGradient;
CGColorSpaceRef myColorspace;

size_t num_locations = 2;
CGFloat locations[2] = {0.0, 1.0};
CGFloat components[8] = {0.8f, 0.8f, 0.8f, 1.0f, // Bottom Colour: Red, Green, Blue, Alpha.
    0.9f, 0.9f, 0.9f, 1.0}; // Top Colour: Red, Green, Blue, Alpha.

myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents (myColorspace, components,
                                                  locations, num_locations);

CGColorSpaceRelease(myColorspace);

CGPoint startPoint, endPoint;
startPoint.x = 0.0;
startPoint.y = self.frame.size.height;
endPoint.x = 0.0;
endPoint.y = 0.0;
CGContextDrawLinearGradient (c, myGradient, startPoint, endPoint, 0);

const CGFloat topSepColor[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // Cell Seperator Colour - Top

CGGradientRelease(myGradient);

CGContextSetStrokeColor(c, topSepColor);

CGContextMoveToPoint(c, 0.0, 0.0);
CGContextSetLineWidth(c, 1.0);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextAddLineToPoint(c, self.frame.size.width, 0.0);
CGContextStrokePath(c);

const CGFloat bottomSepColor[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // Cell Seperator Colour - Bottom
CGContextSetStrokeColor(c, bottomSepColor);

CGContextMoveToPoint(c, 0.0, self.frame.size.height);
CGContextSetLineWidth(c, 1.0);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextAddLineToPoint(c, self.frame.size.width, self.frame.size.height);
CGContextStrokePath(c);

[[UIColor blackColor] set];
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

我不明白为什么人们会尝试编写过于复杂的绘图例程来渲染自定义UITableViewCell。将单元格的backgroundViewselectedBackgroundView属性的值设置为标准UIImageView,其中包含所有边框,斜角,渐变,圆角以及图像中您喜欢的任何其他内容。

对于圆形表视图,您将创建4个图像;一个用于顶部单元格,另一个用于底部单元格,一个用于中间单元格,另一个用于单个单元格(如果您的表格只有一行)。

Matt Gallagher在Cocoa with Love上撰写了一篇很好的文章,名为Easy custom UITableView drawing

答案 1 :(得分:6)

使用单元格背景的自定义视图可以完全自定义单元格的外观,但在更改屏幕方向时可能无法很好地缩放。此外,如果您只需要一个适用于普通单元格和分组样式单元格的渐变背景,那么最好用这个...

我有另一个解决方案,它的代码少得多,只需要一个渐变图像。组单元格样式的圆角仍然由框架绘制,因此我们无需担心为顶部,中间和底部单元格样式提供自定义图像以使用此方法来满足圆角。这是它的外观:

Image showing the table view cells containing the gradient background in grouped style with rounded corners

渐变图像是单个像素宽且与单元格一样高(在此示例中为44像素)。

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cellBackground_1x44.png"]];

代码使用UIColor上的colorWithPatternImage方法,自iOS 2.0开始提供。应在tableView:cellForRowAtIndexPath:中调用此代码。重新使用单元格时,没有必要重复调用,仅在最初创建单元格时。

要使用我正在使用的灰色渐变,我发现设置所选单元格的选择颜色非常有用:

cell.selectionStyle = UITableViewCellSelectionStyleGray;

您可能还想使用以下内容更改单元格边框的颜色:

[self.tableView setSeparatorColor:[UIColor darkGrayColor]];

嗯,就是这样。我希望人们觉得这很有用。我昨天在网上搜索了几个小时,只得到了包含自定义绘图代码的参考资料,这些代码生成了渐变和圆角,或者我找到了Matt Coneybeare的“如何在核心图形的集合式UITABLEVIEW中制作定制的渐变背景”的链接帖子。一切正常,但如果你只是想要一些简单的东西,我相信这就是它。

答案 2 :(得分:0)

你可以尝试像

一样的smth
for(UIView* v in [cell subviews]){
   [v setBackgroundColor:[UIColor clearColor]];
}

但这只是一个建议。