ios – 没有drawRect的Live Xcode的Interface Builder UIView子类(IB_DESIGNABLE):

前端之家收集整理的这篇文章主要介绍了ios – 没有drawRect的Live Xcode的Interface Builder UIView子类(IB_DESIGNABLE):前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以创建一个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).

这就是为什么在预览中看不到当前代码的原因:当调用commonProgressIndicatorInit时(来自initWithFrame:(CGRect)框架构造函数),框架等于CGRectZero(x:0 y:0 width:0 height) :0)这样你的中心变量实际上等于(0,0),半径是-1.
在设备上,根据类的使用方式,可以使用正确的框架直接调用,这就是它可以在设备上工作而不在IB中工作的原因.

为了解决这个问题,我将实现layoutSubviews选择器(从UIView覆盖它)以正确组织子层.当帧将从CGRectZero更改为Interface Builder中设置的正确值时,将调用此选择器.

猜你在找的Xcode相关文章