2013-10-28 36 views
18

裏面我的應用程序使用CAGradientLayer設置我的手機的背景下,這樣的水平CAGradientLayer:在IOS 7.0

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被忽略)

在同一問題中遇到任何人嗎?

感謝,

佩裏

回答

37

這個問題是相當老了,但我碰到它,所以其他人可能會爲好。下面的代碼將產生一個iPhone上運行模擬器與7.0.3版

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

我不知道爲什麼你的代碼不能正常工作水平梯度,但我得到奇怪的行爲,如果我不設置錨點 - 漸變仍然是水平的。也許它與它是一個單元格背景視圖有關 - 你可以嘗試將梯度應用到基礎表。

+4

請注意'[UIColor clearColor]'創建了一個奇怪的灰色細微差別。正如這個答案一樣,使用'[UIColor colorWithWhite:1.0 alpha:0.0]'代替。這會給你一個透明的漸變。 –

3

現在剛剛碰到它,3年後。感謝Gord爲此解決方案。這裏是在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) 
}