2013-10-28 12 views
18

Innerhalb meiner Anwendung ich eine CAGradientLayer verwenden Sie den Hintergrund meiner Zelle zu setzen, auf diese Weise:horizontal CAGradientLayer in 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; 

(dieser Code ist innerhalb - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)

Es funktioniert auf iOS 6 aber funktioniert nicht auf iOS 7, in der neuen iOS ist der Gradient immer vertikal (StartPoint und EndPoint werden ignoriert)

ist jemand in dem gleichen Problem aufgetreten?

Danke,

Perry

Antwort

37

Diese Fragen ist ziemlich alt, aber ich kam über sie, so dass andere wird wahrscheinlich auch. Der folgende Code wird eine horizontale Gradient läuft auf einem iPhone-Simulator mit Version 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]; 
} 

Ich bin nicht sicher produzieren, warum Ihr Code funktioniert nicht, aber ich merkwürdiges Verhalten, wenn ich den Anker nicht gesetzt Punkt - der Verlauf ist jedoch immer noch horizontal. Vielleicht hat es etwas damit zu tun, dass es eine Zellenhintergrundansicht ist - Sie könnten versuchen, den Farbverlauf auf die zugrunde liegende Tabelle anzuwenden.

+4

Beachten Sie, dass '[UIColor clearColor]' eine seltsame graue Nuance erstellt. Für diese Antwort verwenden Sie stattdessen den '[UIColor colorWithWhite: 1.0 alpha: 0.0]' '. Dadurch erhalten Sie einen transparenten Verlauf. –

3

Ich bin gerade erst drei Jahre darauf gekommen. Danke Gord für diese Lösung. Hier ist es in 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) 
}