顶部和底部具有透明渐变的UITableView

时间:2012-02-02 01:08:32

标签: iphone ios uitableview core-graphics calayer

我搜索了这个论坛,Google和其他论坛,但没有找到我特定问题的答案。

基本上,我有UIView,其中包含UITableView。我遵循了这个tutorial并且部分成功了。问题是梯度。我在UITableView后面有一张背景图片。因此,当细胞接近渐变时,我想要显示背景,而不是白色。

我也找到了这个post,这是我找到教程的地方,但我不想用自己的问题劫持那篇帖子。

任何正确方向的帮助都会很棒!

EDIT1:我知道我可以使用背景图像和中间剪切的另一个图像,但我正在寻找AVOIDS使用PNG的解决方案,如果可能的话。

EDIT2:这是我现在得到的图像:

enter image description here

EDIT3:

这是我的代码:

部首:

@interface MyView : UIViewController  {
    CAGradientLayer *_maskLayer;
    UITableView *_tableView;
}

@property (nonatomic, retain) CAGradientLayer *maskLayer;
@property (nonatomic, retain) IBOutlet UITableView *tableView;

实现:

@implementation HighScoresView_iPhone

@synthesize tableView = _tableView;
@synthesize maskLayer = _maskLayer;

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    if (![self maskLayer]) {
        [self setMaskLayer:[CAGradientLayer layer]];
        CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
        CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;

        [[self maskLayer] setColors:[NSArray arrayWithObjects:
                                     (id)outerColor, 
                                     (id)innerColor, 
                                     (id)innerColor, 
                                     (id)outerColor, 
                                     nil
                                     ]
         ];
        [[self maskLayer] setLocations:[NSArray arrayWithObjects:
                                       [NSNumber numberWithFloat:0.0], 
                                       [NSNumber numberWithFloat:0.2], 
                                       [NSNumber numberWithFloat:0.8], 
                                       [NSNumber numberWithFloat:1.0], 
                                       nil
                                       ]
        ];
        [[self maskLayer] setBounds:CGRectMake(0, 0, [[self scoreTableView] frame].size.width, [[self scoreTableView] frame].size.height)];
        [[self maskLayer] setAnchorPoint:CGPointZero];
        [[[self scoreTableView] layer] addSublayer:[self maskLayer]];
    }
}

4 个答案:

答案 0 :(得分:22)

您可以使用CALayer mask属性执行此操作。但是您无法在表视图的自己的图层上设置蒙版,因为该蒙版将与表的行一起滚动。相反,将表视图放在为此创建的新的超级视图(类UIView)中。称之为tableMaskView

新的超级视图应将其backgroundColor属性设置为UIColor.clearColor,并将其opaque属性设置为NO。然后你可以像这样设置它的面具:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.tableMaskView.bounds;
gradient.colors = [NSArray arrayWithObjects:
    (__bridge id)UIColor.clearColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.clearColor.CGColor,
    nil];
gradient.locations = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0],
    [NSNumber numberWithFloat:1.0/16],
    [NSNumber numberWithFloat:15.0/16],
    [NSNumber numberWithFloat:1],
    nil];
self.tableMaskView.layer.mask = gradient;

使用图层蒙版不是最有效的方法,但它是最容易编程的。测试它是否足够快。

答案 1 :(得分:1)

Swift 3版rob mayoffanswer

let gradient = CAGradientLayer()
gradient.frame = tableMaskView.bounds
gradient.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, 
                   UIColor.white.cgColor, UIColor.clear.cgColor]
gradient.locations = [0 as NSNumber, 1.0/16.0 as NSNumber, 
                      15.0/16.0 as NSNumber, 1 as NSNumber]
tableMaskView.layer.mask = gradient

答案 2 :(得分:0)

听起来您的表格视图的背景颜色设置为白色。尝试将表格视图的背景设置为透明:

tableView.backgroundColor = [ UIColor clearColor ] ;
tableView.opaque = NO ;

答案 3 :(得分:0)

替换此行:

[[[self scoreTableView] layer] addSublayer:[self maskLayer]];

有了这个:

self.scoreTableView.layer.mask = self.maskLayer;

(或者如果你坚持你的语法风格,甚至认为我不明白为什么):

[[[self scoreTableView] layer] setMask:[self maskLayer]];

同样this回答可能对您有帮助。

相关问题