iphone: добавление CALayer в качестве подслоя к UIButton Layer вызывает EXC_BAD_ACCESS

Привет, я пытаюсь добавить красивый градиент в 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. "Сборка и анализ" не показывает ошибок.

Кто-нибудь видит мою проблему?


person dac    schedule 20.05.2011    source источник


Ответы (1)


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:] ()
person diciu    schedule 20.05.2011
comment
Я попробовал вашу последовательность, но это не сработало! Я думал, что вызов [downButtonLayer addSublayer:hintergrundButtonLayer]; просто давая указатель на объектhintergrundButtonLayer-объекту downButtonLayer.. если я устанавливаю свой указательhintergrundButtonLayer на ноль, объект downButtonLayer все равно должен иметь указатель на объектhintergrundButtonLayer. - person dac; 20.05.2011
comment
Ты сделал это!!! Большое вам спасибо за вашу помощь !!!! Это была именно та проблема, неправильный тип цвета;) - person dac; 20.05.2011