带透明渐变的UITableView顶部和底部

我已经search了这个论坛,谷歌和其他论坛,并没有find我的特定问题的答案。

基本上,我有一个包含UITableViewUIView 。 我遵循这个教程 ,它是部分成功的。 问题是渐变。 我有一个背后的UITableView背景图像。 所以随着细胞接近渐变,我想要显示背景,而不是白色。

我也发现这篇文章是我在哪里find的教程,但我不想用Matt自己的问题来劫持那篇文章。

任何帮助正确的方向将是伟大的!

编辑1:我知道我可以使用另一个图像的背景图像和中间切出,但我正在寻找AVOIDS使用PNG的解决scheme,如果可能的话。

编辑2:这是我现在得到的图像:

在这里输入图像说明

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]]; } } 

你可以用CALayer mask属性来做到这一点。 但是你不能在表视图自己的图层上设置遮罩,因为遮罩会随着表格的行滚动。 相反,把你的表视图放在一个你为此创build的新的超视图( UIView类)中。 称之为tableMaskView

新的UIColor.clearColor视图应该将其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; 

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

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

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

replace这一行:

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

有了这个:

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

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

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

这个答案也可以帮助你。

Swift 3版抢劫mayoff的回答 :

 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