Ios 实时Xcode';不带drawRect的s Interface Builder UIView子类(IB_可设计):

Ios 实时Xcode';不带drawRect的s Interface Builder UIView子类(IB_可设计):,ios,xcode,uiview,interface-builder,ibdesignable,Ios,Xcode,Uiview,Interface Builder,Ibdesignable,是否可以创建一个UIView子类来呈现live-in-Xcode(通过添加IB_DESIGNABLE属性,如前所述),但没有自定义的drawRect:方法 我们有一个自定义的UIView子类,它使用一些CAShapeLayers,它们被添加到self.layer,用于绘图(因此,不需要重写drawRect:)。该类在应用程序上运行良好,但不会在Xcode上渲染 如果我们在drawRect:中复制代码,它可以工作,但我们更愿意让绘图在图层上自动进行 这能做到吗 我也试过了 - (void)dra

是否可以创建一个
UIView
子类来呈现live-in-Xcode(通过添加
IB_DESIGNABLE
属性,如前所述),但没有自定义的
drawRect:
方法

我们有一个自定义的
UIView
子类,它使用一些
CAShapeLayer
s,它们被添加到
self.layer
,用于绘图(因此,不需要重写
drawRect:
)。该类在应用程序上运行良好,但不会在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.x, self.myLayer1.frame.origin.y);
    [self.myLayer2 renderInContext:currentContext];    
}

这似乎在设备上有效,但在Xcode的IB上无效。

如果不查看所有代码,很难看出问题的根源,但要回答您的问题,是的,您可以使用IBInspectable/IBDesignable,而无需实现任何其他特定方法。我已经为一个使用了许多图层而不进行任何绘图(使用嵌套图层)的视图完成了此操作

对于具有圆角的快速测试示例代码段:

@IBDesignable
class MyView : UIView {

    @IBInspectable var cornerRadius:CGFloat {
        get { return self.layer.cornerRadius }
        set { self.layer.cornerRadius = newValue    }
    }

    @IBInspectable var borderWidth:CGFloat {
        get { return self.layer.borderWidth }
        set { self.layer.borderWidth = newValue }
    }

    @IBInspectable var borderColor:UIColor {
        get { return UIColor(CGColor: self.layer.borderColor) }
        set { self.layer.borderColor = newValue.CGColor }
    }
}
有关执行渐变的简单示例,请参见

有关如何调试实时视图的说明,请参阅WWDC§411,大约22分钟


到目前为止,我所看到的唯一限制是,您可以在类扩展中添加可检查的属性,但它们只能在设备上正确渲染。

我一直在使用方法
-(void)prepareforPrinterFaceBuilder
来告诉IB实时渲染视图

请看这里:

另外,你们说得对,Objective-C也可以使用此功能


您不一定需要使用
drawRect
,您可以尝试使用
-(void)layoutSubviews
,它似乎可以工作。仅为了实时渲染而将代码保留在
-(void)layoutSubviews
等位置的问题在于,它的性能可能会降低,等等(例如,您可以在
-(void)awakeFromNib
中执行很多操作,但该方法不会从实时渲染中调用,因此请确保在
中完成所有设置(void)同时准备PrinterFaceBuilder

您可以预览IB中的
UIView
子类(使用
IB_可设计的
宏),即使
drawRect:
未被覆盖
我在XCode 6.1中添加了您的,并在
xib
文件中添加了
OEProgressIndicator
。然后我通过在
CommonProgressIndicatorUnit
选择器中设置断点来调试它(使用菜单
Editor
/
Debug Selected View

以下是您当前代码在预览中看不到任何内容的原因:当调用
CommonProgressIndicatorUnit
时(从
initWithFrame:(cRect)frame
构造函数),帧等于
cRectZero
x:0 y:0宽度:0高度:0
)因此,中心变量实际上等于
(0,0)
,半径为
-1

在设备上,根据类的使用方式,可以使用适当的帧直接调用您,这就是为什么它可以在设备上工作,但不能在IB中工作


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

确保初始化(即设置
CAShapeLayers
)代码也是从
initWithFrame:
调用的。IB调用它进行预览。是的,我也从那里调用它。运气不好。你怎么知道IB使用
initWithFrame:
?IB预览视图时是否有调试视图代码的方法?
编辑器
从Xcode菜单调试所选视图
。调试选择d视图使Xcode与我的自定义视图崩溃:-(我将崩溃和CALayer live渲染问题作为错误报告提交给了苹果。谢谢你的回答,但我们制作的根本不起作用。如果你能在Xcode 6上显示它,请告诉我怎么做。请参阅我们尝试过的两个
drawRect
变通实现,但都没有效果。据我所知,这是一个唯一快速的功能。启动w。)通过我发布的链接作为基线,并从那里分支。
IB_DESIGNABLE
自定义视图并不是一个Swift唯一的功能。它清楚地表明它也可以与Objective-C一起使用。如果只是,这不适用于自定义子CALayers的事实是一个Objective-C唯一的错误。我对苹果公司说。啊,至少你在这个问题上做得很好n-使用Swift。在我们的生产环境中使用Swift目前不是一个选项。这无助于呈现作为当前视图子层的自定义Calayer。