跨多个UIView子类的单个drawRect实现

时间:2015-09-30 22:31:00

标签: ios objective-c uiview drawrect

在我的应用程序中,我有几个不同的UIView子类:UIDatePicker,UIPicker,UIButton,UITableView,UITableViewCell,UITextView等等......对于每一个我想添加一个非常简单的drawRect自定义实现,我工作得很好。

是否有一种简单的方法可以让UIView的多个子类具有相同的drawRect实现,而无需创建子类并在每个UIPicker,UIButton等上重复相同的代码......?

我意识到解决这个问题的方法可能是为UIView的layer属性编写一个委托类,并在drawLayer中进行自定义绘制,但我想在我重新编写代码之前会问。

1 个答案:

答案 0 :(得分:2)

答案似乎是否定的。

此外,似乎我对变通方法的想法也不起作用:我以为我可以编写一个很好的小类来实现CALayerDelegate中的drawLayer方法并在那里进行绘制,然后在每个UIView或UIView中子类'init方法做一个self.layer.delegate = niceLittleCALayerDelegateClass。

然而,我的研究发生在:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/#//apple_ref/occ/instp/CALayer/delegate,其中包含该死的句子:在iOS中,如果图层与UIView对象相关联,则必须将此属性设置为拥有图层的视图。 / p>

所以,双重禁忌。

反对rmaddy的建议我将为每个我希望实现此绘图行为的UIView子类编写一个子类。我们将看到它是如何发生的。

更新

我无法相信我之前没有想过这个,但是“正确”的方式(也就是说没有子类化UIView的子类并为每个子类的子类添加自定义drawRect方法),从我所有的一切可以找到,似乎是创建一个子视图或一个透明背景的子图层,可以做任何你想要的自定义绘图。

显然,这将在你实际使用的UIView之上绘制,所以如果你试图绘制与UIView的默认元素交互的东西,这会变得非常复杂,但是出于我的目的(只是它是一个用UIBezierPath绘制的简单框架,看起来效果很好。

目前我不确定子视图或子层方法是否更有效。如果有人能够阐明这一点,我会很感激。