是否可以创建一个UIView子类,它在
Xcode中呈现(通过添加IB_DESIGNABLE属性,如
here所述),但没有自定义drawRect:方法?
我们有一个自定义的UIView子类,它使用一些CAShapeLayers,它们被添加到self.layer中进行绘制(因此,不需要覆盖drawRect :).这个类在App上工作正常,但不会在Xcode上呈现.
如果我们在drawRect中复制代码:它可以工作,但我们更喜欢让图形在图层上自动发生.
可以这样做吗?
我也尝试过
- (void)drawRect:(CGRect)rect { CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextMoveToPoint(currentContext,self.myLayer1.frame.origin.x,self.myLayer1.frame.origin.y); [self.myLayer1 renderInContext:currentContext]; CGContextMoveToPoint(currentContext,self.myLayer1.frame.origin.y); [self.myLayer2 renderInContext:currentContext]; }
这似乎适用于设备,但不适用于Xcode的IB.
解决方法
即使没有覆盖drawRect:,也可以在IB中使用IB_DESIGNABLE宏预览UIView子类.
我在XCode 6.1中添加了你的 code,并在一个xib文件中添加了一个OEProgressIndicator.然后我通过在commonProgressIndicatorInit选择器中设置断点来调试它(使用菜单Editor / Debug Selected View).
我在XCode 6.1中添加了你的 code,并在一个xib文件中添加了一个OEProgressIndicator.然后我通过在commonProgressIndicatorInit选择器中设置断点来调试它(使用菜单Editor / Debug Selected View).
这就是为什么在预览中看不到当前代码的原因:当调用commonProgressIndicatorInit时(来自initWithFrame:(CGRect)框架构造函数),框架等于CGRectZero(x:0 y:0 width:0 height) :0)这样你的中心变量实际上等于(0,0),半径是-1.
在设备上,根据类的使用方式,可以使用正确的框架直接调用,这就是它可以在设备上工作而不在IB中工作的原因.
为了解决这个问题,我将实现layoutSubviews
选择器(从UIView覆盖它)以正确组织子层.当帧将从CGRectZero更改为Interface Builder中设置的正确值时,将调用此选择器.