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。