iOS 7.0中的水平CAGradientLayer

在我的应用程序中,我使用一个CAGradientLayer来设置我的单元格的背景,用这种方法:

 retValue = [tableView dequeueReusableCellWithIdentifier:@"Cells" forIndexPath:indexPath]; UIView *bgColorView = [[UIView alloc] init]; bgColorView.backgroundColor = [UIColor blueColor]; bgColorView.layer.masksToBounds = YES; id startColor = (id)[[UIColor colorWithWhite:0.75 alpha:1] CGColor]; id endColor = (id)[[UIColor blueColor] CGColor]; CAGradientLayer* gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = retValue.contentView.bounds; gradientLayer.colors = @[startColor,startColor,endColor,endColor]; gradientLayer.locations = @[[NSNumber numberWithFloat:0], [NSNumber numberWithFloat:0.95], [NSNumber numberWithFloat:0.95], [NSNumber numberWithFloat:1]]; [gradientLayer setStartPoint:CGPointMake(0,0.5)]; [gradientLayer setEndPoint:CGPointMake(1,0.5)]; [bgColorView.layer addSublayer:gradientLayer]; retValue.selectedBackgroundView = bgColorView; 

(这个代码在里面- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

它在iOS 6上正常工作,但在iOS 7上不起作用,在新的iOS中,渐变始终是垂直的(startPoint和endPoint被忽略)

有没有人遇到同样的问题?

谢谢,

佩里

这个问题是相当古老的,但我碰到了,所以其他人也可能会。 下面的代码将产生一个在7.0.3版本的iPhone模拟器上运行的水平渐变

 + (void)drawGradientOverContainer:(UIView *)container { UIColor *transBgColor = [UIColor colorWithWhite:1.0 alpha:0.0]; UIColor *black = [UIColor blackColor]; CAGradientLayer *maskLayer = [CAGradientLayer layer]; maskLayer.opacity = 0.8; maskLayer.colors = [NSArray arrayWithObjects:(id)black.CGColor, (id)transBgColor.CGColor, (id)transBgColor.CGColor, (id)black.CGColor, nil]; // Hoizontal - commenting these two lines will make the gradient veritcal maskLayer.startPoint = CGPointMake(0.0, 0.5); maskLayer.endPoint = CGPointMake(1.0, 0.5); NSNumber *gradTopStart = [NSNumber numberWithFloat:0.0]; NSNumber *gradTopEnd = [NSNumber numberWithFloat:0.4]; NSNumber *gradBottomStart = [NSNumber numberWithFloat:0.6]; NSNumber *gradBottomEnd = [NSNumber numberWithFloat:1.0]; maskLayer.locations = @[gradTopStart, gradTopEnd, gradBottomStart, gradBottomEnd]; maskLayer.bounds = container.bounds; maskLayer.anchorPoint = CGPointZero; [container.layer addSublayer:maskLayer]; } 

我不知道为什么你的代码不起作用,但是如果我没有设置锚点,我会得到奇怪的行为 – 虽然渐变仍然是水平的。 也许它与它是一个单元格背景视图有关 – 您可以尝试将梯度应用到基础表。

刚刚碰到它,3年后。 感谢Gord为这个解决scheme。 这里是在Swift 3.0中:

 func drawGradientOver(container: UIView) { let transBgColor = UIColor.clear let black = UIColor.black let maskLayer = CAGradientLayer() maskLayer.opacity = 0.8 maskLayer.colors = [black.cgColor, transBgColor.cgColor, transBgColor.cgColor, black.cgColor] // Hoizontal - commenting these two lines will make the gradient veritcal maskLayer.startPoint = CGPoint(x: 0.0, y: 0.5) maskLayer.endPoint = CGPoint(x: 1.0, y: 0.5) let gradTopStart = NSNumber(value: 0.0) let gradTopEnd = NSNumber(value: 0.4) let gradBottomStart = NSNumber(value: 0.6) let gradBottomEnd = NSNumber(value: 1.0) maskLayer.locations = [gradTopStart, gradTopEnd, gradBottomStart, gradBottomEnd] maskLayer.bounds = container.bounds maskLayer.anchorPoint = CGPoint.zero container.layer.addSublayer(maskLayer) }