iPhone:将CALayer添加为UIButton的图层子图层会导致EXC_BAD_ACCESS错误

4

嘿,大家好, 我想给一个UIButtonTypeRoundedRect添加一个漂亮的渐变效果。以下代码已经实现:

viewWillAppear:(BOOL)animated   

我的视图控制器的功能。

UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
tempButton.frame = CGRectMake(left, top, 80.0f, 80.0f); 

CAGradientLayer * hintergrundButtonLayer = [[CAGradientLayer alloc] init];
[hintergrundButtonLayer setBounds:tempButton.bounds];
[hintergrundButtonLayer setColors:[NSArray arrayWithObjects: 
                   [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1.0],
                   [UIColor colorWithRed:0.4 green:0.5 blue:0.6 alpha:1.0], 
                   nil]];

[hintergrundButtonLayer setPosition: 
             CGPointMake([tempButton bounds].size.width/2, 
                         [tempButton bounds].size.height/2)];

[hintergrundButtonLayer setLocations:
                       [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0], 
                              [NSNumber numberWithFloat:1.0], 
                              nil]];

//      hintergrundButtonLayer.zPosition = -10;
//      hintergrundButtonLayer.frame = [tempButton bounds];


[tempButton addTarget:self action:@selector(switchVendorOnOff:) forControlEvents:UIControlEventTouchUpInside];


CALayer * downButtonLayer = [tempButton layer];
[downButtonLayer setMasksToBounds:YES];
[downButtonLayer setCornerRadius:10.0];
[downButtonLayer setBorderWidth:1.2];
[downButtonLayer setBorderColor:[[UIColor blackColor] CGColor]];


[downButtonLayer addSublayer:hintergrundButtonLayer];

[hintergrundButtonLayer release];
hintergrundButtonLayer = nil;

[self.view addSubview:tempButton];

代码运行良好,直到应用程序尝试显示视图时它会崩溃,并出现 EXC_BAD_ACCESS 错误。但是,如果我注释掉

标签,问题就会消失。
[downButtonLayer addSublayer:hintergrundButtonLayer];   

执行命令后一切正常。

调试器没有显示任何有关泄漏的信息。分配模板也没有显示任何奇怪的东西。控制台上除了EXC_BAD_ACCESS消息之外没有其他输出。"构建和分析"没有显示错误。

有谁能看到我的问题吗?

1个回答

8

setColors 需要传入 CGColors,而不是 UIColors。

[hintergrundButtonLayer setColors:[NSArray arrayWithObjects: 
    [[UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1.0] CGColor],
    [[UIColor colorWithRed:0.4 green:0.5 blue:0.6 alpha:1.0] CGColor], 
    nil]];

如果你在调试器下读取崩溃时的顶部堆栈帧,它们会提示CGColors存在问题:

(gdb) bt
#0  0x00bd407c in CGColorSpaceGetMD5Digest ()
#1  0x00b4f8b2 in CGColorTransformConvertColorFloatComponents ()
#2  0x00b4fea2 in CGColorTransformConvertColorComponents ()
#3  0x00cb0d62 in CA_CGColorGetRGBComponents ()
#4  0x00d509aa in -[CAGradientLayer _copyRenderLayer:layerFlags:commitFlags:] ()

我尝试了你的建议,但它没有起作用!我认为调用[downButtonLayer addSublayer:hintergrundButtonLayer]只是将指针提供给hintergrundButtonLayer对象到downButtonLayer对象..如果我将我的指针hintergrundButtonLayer设置为nil,downButtonLayer对象仍然应该有一个指向hintergrundButtonLayer对象的指针。 - dac
你做到了!!!非常感谢你的帮助!!!正是那个问题,颜色类型错误 ;) - dac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接