簡體   English   中英

CAShapeLayer上的CAGradientLayer SetMask崩潰了

[英]CAGradientLayer SetMask on CAShapeLayer crashes app

使用示例代碼許多 偉大的 ,我能夠讓使用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:調用時,它不會崩潰,而只是用漸變填充整個幀。

似乎我只是缺少一些次要的或明顯的東西。 請注意,使用iOS 6和ARC-希望繼續使用CAShapeLayer和CAGradientLayer,因為它可以使動畫制作起來更容易(這是最終目標)。

以下代碼在ensure_transaction_recursively觸發堆棧溢出。

[gradientLayer setMask:_testLogo.layer];
[_testLogo.layer insertSublayer:gradientLayer atIndex:0];

形狀層具有漸變層子視圖,該子視圖具有形狀層蒙版,該形狀層遮罩具有漸變層子視圖...

由於您的目標是要有一個被形狀遮罩的漸變層,因此BMTestLogo應該由CAGradientLayer支持,然后將CAShapeLayer作為其遮罩。 形狀層永遠不要引用漸變層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM