我正在尝试为另一个图层创建一个蒙版,因此要子类化
如果我使用一个
CALayer
。
我想使用我的CALayer
子类来替换CAGradientLayer
并将其用作渐变蒙版,如此处所述。
但是,我希望使用自定义的CALayer
,该图层使用内部的CGGradient
进行绘制,因为这应该比CAGradientLayer
产生更平滑的结果(请参见此处)。我不关心性能,我需要更好的渐变质量。
我正在遵循此示例来创建我的CGGradient
并将其存储在CALayer
上。然而,我无法绘制出蒙版。
我不知道在哪里放置绘图代码:CALayer
的display
、drawInContext:(CGContextRef)ctx
或drawInContext:(CGContextRef)ctx
似乎在用作蒙版时没有被调用。
请容忍我,因为我对CoreAnimation还不熟悉。那么,如何修复这个问题,使我的CALayer
子类可以作为CAGradientLayer
的替代品,但使用CGGradient
进行绘制?
我的当前代码在此处:
@interface CANiceGradientLayer : CALayer
@property (nonatomic) CGGradientRef gradient;
@property (atomic) CGPoint startPoint;
@property (atomic) CGPoint endPoint;
@end
@implementation CANiceGradientLayer
- (instancetype)initWithGradientRef:(CGGradientRef)gradient startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint
{
if ( !(self = [super init]) )
{
return nil;
}
self.gradient = CGGradientRetain(gradient);
self.startPoint = startPoint;
self.endPoint = endPoint;
return self;
}
- (void)dealloc
{
CGGradientRelease(self.gradient);
}
- (void)display
{
NSLog(@"display");
}
- (void)drawInContext:(CGContextRef)ctx
{
NSLog(@"drawInContext:");
CGContextDrawLinearGradient(ctx, self.gradient, self.startPoint, self.endPoint, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);;
}
- (void)renderInContext:(CGContextRef)ctx
{
NSLog(@"renderInContext:");
}
@end
以下是我创建它的步骤:
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 1.0, 1.0, 1.0, // Start color
1.0, 1.0, 1.0, 0.0 }; // End color
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
self.collectionViewTickerMaskLayer = [[CANiceGradientLayer alloc] initWithGradientRef:gradient startPoint:CGPointZero endPoint:CGPointZero];
self.collectionViewTickerMaskLayer.anchorPoint = CGPointZero;
view.layer.mask = self.collectionViewTickerMaskLayer;
如果我使用一个
CAGradientLayer
,它可以正常工作(但是渐变看起来不好)。
renderInContext:
方法。这可能是问题所在吗?请尝试调用 super 实现或将其注释掉,看看是否有变化。 - Léo Natan