我已经创建了一个自定义按钮。我在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
设备
TESTS
我已经在iOS 5.1和4.2上测试过相同的结果。似乎在模拟器版本4.1,4.2和5.1
上工作相同答案 0 :(得分:0)
我发现您的代码至少有两个问题:
每次更改颜色时都会添加一个新图层,而不会删除旧图层。首先,删除先前创建的子图层(或者只是更改其颜色而不创建和添加新图层)。请注意,opaque
的默认CALayer
属性设置为NO
,这意味着它正在与所有其他子图层混合。
为什么还要添加其他子图层?在您的代码中,您完全覆盖了primaryBackground
。 setBackgroundColor:
函数不能只是这样:
- (void)setBackgroundColor:(UIColor *)backgroundColor {
[primaryBackground setBackgroundColor:backgroundColor.CGColor];
}
但是如果你真的必须有一个额外的图层,你应该将ll
的{{1}}设置为frame
的{{1}}(不是{{1} }})。它应该是bounds
。您还应该覆盖superlayer
方法,并将背景图层的frame
再次设置为根图层的边界。
请记住,在 iPhone模拟器上,事物由不同的子系统呈现,并且比在真实设备上快得多。有些帧计算可能会重叠等等。