我真的需要在自定义 UIView 中使用 drawRect() 吗?

Posted

技术标签:

【中文标题】我真的需要在自定义 UIView 中使用 drawRect() 吗?【英文标题】:Do I really need drawRect() in custom UIView? 【发布时间】:2015-06-04 02:29:14 【问题描述】:

我是 ios 新手,并试图了解 drawRect() 在自定义 UIViews 中的使用,所以我有一个简单的自定义视图,我从代码初始化。我想更新它的颜色,我看到两种方法,如下所示.我应该使用哪一个?为什么?

//VController
CustomView *cv = [[CustomView alloc] initWithFrame:...]
...
[cv updateColors];

//CustomView
-(id) initWithFrame 
-(id) initWithCoder  
-(void) updateColors(UIColor *color)  ----(1)
  ...Draw here with new color ...
   view1.backgroundColor = color;
   view2.backgroundColor = color;

 
- (void) drawRect
 ... draw here with new color ... ---------(2)
   view1.backgroundColor = color;
   view2.backgroundColor = color;
 

【问题讨论】:

【参考方案1】:

如果全部您想要更改此视图或其某些子视图的背景颜色,您绝对不应该为此滥用drawRect:drawRect: 用于在系统认为需要刷新时绘制视图(即其内容);它在很多且不可预测的时间被调用,而您不需要它 - 您只需要根据需要更改背景颜色,即视图的 feature。同样drawRect: 不是执行子视图管理的地方。

但如果您绘制视图的内容(例如,视图显示一个圆圈,而您需要绘制该圆圈来描绘视图),那么您必须使用drawRect: 为此;它是唯一视图有机会绘制自己的地方。

【讨论】:

如果我有一个视图并且它的子层需要被删除并重新添加,在drawRect中可以这样做吗?我目前使用这种方式,因为我没有其他方法可以触发重新添加。 @Wingzero 绝对不是。添加和删​​除子视图与视图内容的绘制无关任何 好吧,当我拿到项目的时候,有很多代码在做这样的事情,我猜是因为开发者很懒惰,所以只有调用addSubview会处理所有任务。我想我必须停止这种错误的方式 还有一个问题,可以在drawRect里面做动画吗?如果没有,有哪些好地方?

以上是关于我真的需要在自定义 UIView 中使用 drawRect() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我无法使用 UIScrollView 时,如何在自定义 UIView 中模拟惯性滚动?

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

如何从 cellForRowAt 调用 draw(_ rect: CGRect) 在自定义 tableview 上绘图?

在自定义 UIView 类 Iphone 上应用自动布局约束。

如何在自定义 UIView 中添加 UITableView?

如何快速在自定义导航栏顶部制作一半的 ImageView