gpt4 book ai didi

ios - 如何将 CALayer 子类化以用作另一个 CALayer 掩码?

转载 作者:可可西里 更新时间:2023-11-01 04:46:32 26 4
gpt4 key购买 nike

我正在尝试子类化 CALayer 以用作另一层上的 mask 。

我想使用我的 CALayer 子类代替 CAGradientLayer 并将其用于渐变蒙版,如 here 所述.

不过,我希望使用自定义 CALayer,它使用内部 CGGradient 进行绘图,因为这会产生比 CAGradientLayer 更平滑的结果( see here)。我不关心性能,我想要更好的渐变质量。

我正在关注 this example用于创建我的 CGGradient 并将其存储在 CALayer 上。但是,我无法绘制 mask 。

我不知道在哪里放置绘图代码:CALayerdisplay 也不是 drawInContext:(CGContextRef)ctx 也不是 drawInContext:(CGContextRef)ctx 好像是当做 mask 的时候调用的。

请耐心等待,因为我是 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,它工作正常(但渐变看起来很糟糕)。

最佳答案

在将图层子类设置为蒙版之前调用 -setNeedsDisplay,您只需重写 CALayer-drawInContext: > 子类。这将帮助您获得要调用的方法(CALayer 调用 -drawInContext: 使用它在 -setNeedsDisplay 之后调用的 -display 的默认实现).您可能还必须设置图层的框架:

self.collectionViewTickerMaskLayer.frame = view.layer.bounds;
self.collectionViewTickerMaskLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

这段代码存在逻辑问题。您正在使用 CGPointZero 端点,因此即使调用了这些方法,也不会绘制任何渐变来掩盖您的图层。

关于ios - 如何将 CALayer 子类化以用作另一个 CALayer 掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com