Dirò questo primo, la risposta di iKiR era più che abbastanza per me. Ho copiato il codice così com'è e, con poca esperienza da parte mia, sono riuscito a farlo funzionare senza sforzo (su un UITableView
).
- Creare una nuova sottoclasse UIView, lo chiamerò
MaskingView
- importazione
QuartzCore
quadro!
- Incollare il codice qui sotto nella init. (e/o
initWithFrame:
a seconda del caso)
- Aggiungere la vista in cui si desidera applicare la sfumatura di opacità all'interno di
MaskingView
. (In Interface Builder, user Editor -> Incorpora in -> Visualizza. Quindi, scegli la classe della nuova superview come MaskingView
)
- Dai il massimo a IKiR, perché non ho idea di come funzioni il codice, ma semplicemente funziona!
NOTE:
- Sto sviluppando un'applicazione universale, e il codice qui sotto funziona in quanto è su entrambi i dispositivi! (iPhone/iPad)
- Quando si utilizza Incorpora In -> UIView, la nuova vista sarà leggermente più grande della visualizzazione secondaria. Devi adattarlo esattamente alla sottoview. Ma, prima di ridimensionarlo, assicurati di deselezionare le visualizzazioni secondarie autoresize.
Il Codice:
CALayer *viewLayer = [self layer];
CALayer* maskLayer = [CALayer layer];
maskLayer.bounds = viewLayer.bounds;
[maskLayer setPosition:CGPointMake(CGRectGetWidth(viewLayer.frame)/2.0, CGRectGetHeight(viewLayer.frame)/2.0)];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate (NULL, viewLayer.bounds.size.width, viewLayer.bounds.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGFloat colors[] = {
0.5, 0.5, 0.5, 0.0, //BLACK
0.0, 0.0, 0.0, 1.0, //BLACK
};
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
CGColorSpaceRelease(colorSpace);
NSUInteger gradientH = 20;
NSUInteger gradientHPos = 0;
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0].CGColor);
CGContextFillRect(context, CGRectMake(0, gradientHPos + gradientH, CGRectGetWidth(maskLayer.frame), CGRectGetHeight(maskLayer.frame)));
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.0].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, 320, gradientHPos));
CGContextDrawLinearGradient(context, gradient, CGPointMake(160, gradientHPos), CGPointMake(160, gradientHPos + gradientH), 0);
CGGradientRelease(gradient);
CGImageRef contextImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
[maskLayer setContents:(__bridge id)contextImage];
CGImageRelease (contextImage);
viewLayer.masksToBounds = YES;
viewLayer.mask = maskLayer;
Tutte le idee? Per favore... – iKiR