Iphone 如何设置渐变UITableViewCell背景?

Iphone 如何设置渐变UITableViewCell背景?,iphone,objective-c,cocoa-touch,uitableview,Iphone,Objective C,Cocoa Touch,Uitableview,我想创建一个渐变UITableViewCell背景,就像iPhone上的默认时钟应用程序一样。我不确定如何做到这一点。我是否创建图像并将其设置为: cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]]; 或者有其他/更好的方法吗?请参见我找到了这个问题的现有答案,但并不满意。这里有一种替代方法,它需要更少的代码,不需要重写任何

我想创建一个渐变UITableViewCell背景,就像iPhone上的默认时钟应用程序一样。我不确定如何做到这一点。我是否创建图像并将其设置为:

cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];

或者有其他/更好的方法吗?

请参见

我找到了这个问题的现有答案,但并不满意。这里有一种替代方法,它需要更少的代码,不需要重写任何方法,并且可以应用于任何视图。想法是将
CAGradientLayer
作为子层添加到
UIView
的层中。我在任何地方都找不到这种方法的文档,所以我想与大家分享

CAGradientLayer
添加到任何
UIView
中,如下所示:

UIView
header-UIView+Gradient.h上的类别:

#import <UIKit/UIKit.h>

@interface UIView (Gradient)
-(void) addLinearUniformGradient:(NSArray *)stopColors;
@end
创建
UITableViewCell
后,如何在
UITableViewCell
的背景视图上设置渐变:

// Set the gradient for the cell's background
CGRect backgroundViewFrame = cell.contentView.frame;
backgroundViewFrame.size.height = yourCellHeight;
cell.backgroundView = [[UIView alloc] initWithFrame:backgroundViewFrame];
[cell.backgroundView addLinearUniformGradient:[NSArray arrayWithObjects:
                                               (id)[[UIColor redColor] CGColor],
                                               (id)[[UIColor greenColor] CGColor], nil]];
此示例仅显示了如何设置简单的两站式渐变(具有均匀间距)。快速查看
CAGradientLayer
文档将向您展示如何设置更复杂的渐变

*编辑以获取其他重要信息*

需要记住的另一件事是,如果在tableView:cellForRowAtIndexPath这样的方法中添加渐变层,则UITableViewCells通常会被重用(即[tableView dequeueReusableCellWithIdentifier:@“foo”])。由于单元格正在被重复使用,如果每次单元格出列时总是向表视图单元格添加渐变层,则在单元格的生命周期内可能会向表视图单元格添加多个渐变层。这可能是性能降低的一个原因。此问题可能在可见结果没有任何变化的情况下发生,因此可能难以检测/观察。有几种方法可以解决这一点,但是你可以考虑的一件事是修改上面的原始代码,除了添加CGaveReuntLead之外,还可以将创建的CaGeReaveTeLead返回给调用方。然后,编写另一个category方法非常简单,如果渐变层实际上包含在视图中,则可以将其删除:

-(BOOL) removeGradient:(CAGradientLayer *)gradientLayer
{
    // Search for gradient layer and remove it
    NSArray *layers = [self.layer sublayers];
    for ( id layer in layers ) {
        if ( layer == gradientLayer ) {
            [gradientLayer removeFromSuperlayer];
            return YES;
        }
    }

    // Failed to find the gradient layer in this view
    return NO;
}

对于所有用例不需要移除梯度,但是如果用例导致单元重用,则可能需要考虑移除梯度。要考虑调用这个方法的一个地方是UITababVIEW的PravaReFieldRead方法。


很抱歉,我最初的解决方案没有解决这个问题。但是,由于这是一个相当微妙的问题,我想用这些额外的信息更新我的答案。

如果我的身高不相等,该怎么办?如何创建背景图形?我尝试将其应用于分组单元格,但渐变填充是一个没有圆角的框。我遗漏了什么吗?嗯,你可能需要设置图层半径/遮罩。阅读以下两种方法的文档:[self.layer setCornerRadius:10.0];[self.layer setMasksToBounds:YES];希望这能为你指明正确的方向。
-(BOOL) removeGradient:(CAGradientLayer *)gradientLayer
{
    // Search for gradient layer and remove it
    NSArray *layers = [self.layer sublayers];
    for ( id layer in layers ) {
        if ( layer == gradientLayer ) {
            [gradientLayer removeFromSuperlayer];
            return YES;
        }
    }

    // Failed to find the gradient layer in this view
    return NO;
}