2013-10-28 10 views
18

Dentro la mia domanda ho utilizzare un CAGradientLayer per impostare lo sfondo della mia cella, in questo modo:CAGradientLayer orizzontale 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; 

(questo codice si trova all'interno - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)

Funziona bene su iOS 6 ma non funziona su iOS 7, nel nuovo iOS il gradiente è sempre verticale (startPoint e endpoint vengono ignorati)

qualcuno ha riscontrato nello stesso problema?

Grazie,

Perry

risposta

37

Questa domanda è piuttosto vecchio, ma mi sono imbattuto in esso, in modo che altri probabilmente sarà pure. Il seguente codice produrrà un gradiente orizzontale in esecuzione su un simulatore di iPhone con la versione 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]; 
} 

io non so perché il codice non funziona, ma ottengo un comportamento strano se non imposto l'ancora punto - il gradiente è ancora orizzontale però. Forse ha qualcosa a che fare con la visualizzazione di sfondo di una cella - puoi provare ad applicare la sfumatura alla tabella sottostante.

+4

Si noti che '[UIColor clearColor]' crea una strana sfumatura di grigio. Come questa risposta, usa invece '[UIColor colorWithWhite: 1.0 alpha: 0.0]'. Questo ti darà un gradiente trasparente. –

3

L'ho appena visto, 3 anni dopo. Grazie Gord per questa soluzione. Eccolo 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) 
} 
Problemi correlati