CALayer不在设备上渲染背景颜色,在模拟器中工作

时间:2012-08-22 02:05:16

标签: iphone ios core-animation calayer cagradientlayer

我已经创建了一个自定义按钮。我在init中创建了一堆图层。一切都按预期工作,直到我去修改它们。只有在实际设备上才会出现问题,在模拟器上代码按预期工作。

我尝试通过将needsDisplay和needsLayout设置为YES来强制渲染图层。

-(void) setBackgroundColor:(UIColor *)backgroundColor
{   
    //return; // if I return here, the button gets initialized with it's default royal blue color.  This works correctly on the simulator and device

    [primaryBackground setColors: [NSArray arrayWithObject:(id)backgroundColor.CGColor]];

    //return; //if I return here, primaryBackground will display a clear background on the device, but will display CGColor on the simulator.

    CALayer* ll = [CALayer layer];
    ll.frame=self.frame;
    ll.cornerRadius=primaryBackground.cornerRadius;
    [ll setBackgroundColor:backgroundColor.CGColor];
    [primaryBackground addSublayer:ll];

     //if I return here, primaryBackground will display the "expected" results on both platforms.  IE: it dispalys the new layer, but not it's background color.
}

SIMULATOR

simulator screenshot

设备

device screenshot

TESTS

我已经在iOS 5.1和4.2上测试过相同的结果。似乎在模拟器版本4.1,4.2和5.1

上工作相同

1 个答案:

答案 0 :(得分:0)

我发现您的代码至少有两个问题:

  1. 每次更改颜色时都会添加一个新图层,而不会删除旧图层。首先,删除先前创建的子图层(或者只是更改其颜色而不创建和添加新图层)。请注意,opaque的默认CALayer属性设置为NO,这意味着它正在与所有其他子图层混合。

    为什么还要添加其他子图层?在您的代码中,您完全覆盖了primaryBackgroundsetBackgroundColor:函数不能只是这样:

    - (void)setBackgroundColor:(UIColor *)backgroundColor { 
        [primaryBackground setBackgroundColor:backgroundColor.CGColor];
    }
    

  2. 但是如果你真的必须有一个额外的图层,你应该将ll的{​​{1}}设置为frame的{​​{1}}(不是{{1} }})。它应该是bounds。您还应该覆盖superlayer方法,并将背景图层的frame再次设置为根图层的边界。

  3. 请记住,在 iPhone模拟器上,事物由不同的子系统呈现,并且比在真实设备上快得多。有些帧计算可能会重叠等等。