3

我已经从图层中创建了一个自定义按钮。我在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.
}

模拟器

模拟器截图

设备

设备截图

测试

我已经在 iOS 5.1 和 4.2 上进行了测试,结果相同。似乎在模拟器版本 4.1、4.2 和 5.1 上工作相同

4

1 回答 1

0

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

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

    为什么还要添加另一个子层?在您的代码中,您完全覆盖primaryBackground。不能setBackgroundColor:像这样运行:

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

    ?

  2. 但是如果你真的必须有一个额外的层,你应该将ll's设置frameboundsof the superlayer(not frame)。应该是ll.frame = self.bounds。您还应该覆盖该- (void)layoutSubivews方法并frame再次将背景层的边界设置为根层的边界。

请记住,在iPhone Simulator上,事物由不同的子系统渲染,并且比在真实设备上快得多。并且某些帧计算可能会重叠等。

于 2012-09-15T01:53:17.320 回答