CAShapeLayer上的CAGradientLayer SetMask崩溃应用程序
使用来自许多优秀人士的示例代码,我可以使用CAShapeLayer制作复杂的形状,并使用子类UIView呈现没有问题:
@implementation BMTestLogo
+ (Class)layerClass {
return [CAShapeLayer class];
}
- (void)layoutSubviews {
[self setUpPaths];
[self setLayerProperties];
// [self attachAnimations];
}
- (void)setLayerProperties {
CAShapeLayer *layer = (CAShapeLayer *)self.layer;
// _gradient = [CAGradientLayer layer];
CGMutablePathRef combinedPath = CGPathCreateMutableCopy([[_UIBezierPathsArray objectAtIndex:0] CGPath]);
for (UIBezierPath* path in _UIBezierPathsArray) {
CGPathAddPath(combinedPath, NULL, path.CGPath);
}
layer.path = combinedPath;
layer.fillColor = [UIColor clearColor].CGColor;
layer.fillRule = kCAFillRuleEvenOdd;
}
这段代码工作的很好,现在试图添加一个CAGradientLayer并遮罩这个形状,我一直在崩溃,特别是: QuartzCore CA::Layer::ensure_transaction_recursively(CA::Transaction*):
这里是渐变代码,请注意,这是从SO上的其他工作示例中提取的:
@implementation BMViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[_testLogo setNeedsDisplay];
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.startPoint = CGPointMake(0.5,1.0);
gradientLayer.endPoint = CGPointMake(0.5,0.0);
gradientLayer.frame = CGRectMake(CGRectGetMinX(_testLogo.layer.bounds), CGRectGetMinY(_testLogo.layer.bounds), CGRectGetWidth(_testLogo.layer.bounds), CGRectGetHeight(_testLogo.layer.bounds));
NSMutableArray *colors = [NSMutableArray array];
for (int i = 0; i < 2; i++) {
[colors addObject:(__bridge id)[UIColor colorWithHue:(0.1 * i) saturation:1 brightness:.8 alpha:1].CGColor];
}
gradientLayer.colors = colors;
NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];
NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];
gradientLayer.locations = locations;
gradientLayer.needsDisplayOnBoundsChange = YES;
[gradientLayer setMask:_testLogo.layer];
[_testLogo.layer insertSublayer:gradientLayer atIndex:0];
// Do any additional setup after loading the view, typically from a nib.
}
我试图调试和研究这个问题,UIColors通常不是CGColors或(__bridge id)的嫌疑犯不在,我使用了两个位置作为渐变,只有2种颜色,而且我尝试了几十个不同版本:有或没有setNeeds显示,属性与本地声明,子类内部和外部的渐变图层,所有仍然给我插入子播放器时相同的崩溃。
当我取出setMask:call时,它不会崩溃,只是用渐变填充整个框架。
这看起来像我只是想念一些小事或明显的事情。 请注意,使用iOS 6和ARC--希望继续使用CAShapeLayer和CAGradientLayer,因为它使动画变得更容易(这是最终目标)。
以下代码在ensure_transaction_recursively
触发堆栈溢出。
[gradientLayer setMask:_testLogo.layer];
[_testLogo.layer insertSublayer:gradientLayer atIndex:0];
形状图层具有渐变图层子视图,该图层具有形状图层蒙版,该图层蒙版具有渐变图层子视图...
既然你的目标是有一个被形状掩盖的渐变图层, BMTestLogo
应该由CAGradientLayer
支持,然后CAGradientLayer
将CAShapeLayer
作为其掩码。 形状图层不应该引用渐变图层。
上一篇: CAGradientLayer SetMask on CAShapeLayer crashes app
下一篇: How to calculate the height of an NSAttributedString with given width in iOS 6