简单的 UIView drawRect 没有被调用
Posted
技术标签:
【中文标题】简单的 UIView drawRect 没有被调用【英文标题】:Simple UIView drawRect not being called 【发布时间】:2011-06-07 21:07:30 【问题描述】:我无法弄清楚这里有什么问题。我有一个非常简单的 UIViewController 和一个非常简单的 viewDidLoad 方法:
-(void)viewDidLoad
NSLog(@"making game view");
GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];
[self.view addSubview:v];
[super viewDidLoad];
而我的GameView初始化如下:
@interface GameView : UIView
它只是有一个新的 drawRect 方法:
- (void)drawRect:(CGRect)rect
[super drawRect:rect];
NSLog(@"drawing");
在我的控制台中,我看到正在打印“制作游戏视图”,但从未打印过“绘图”。为什么?为什么我的自定义 UIView 中的 drawRect 方法没有被调用。我实际上只是想在屏幕上画一个圆圈。
【问题讨论】:
将[self.view bringSubviewToFront:v];
添加到viewDidLoad
,看看是否有任何不同。
【参考方案1】:
您是否尝试过在视图的初始化中指定框架?因为是创建自定义 UIView,所以需要在调用绘图方法之前指定视图的框架。
尝试将您的 viewDidLoad 更改为以下内容:
NSLog(@"making game view");
GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];
if (v == nil)
NSLog(@"was not allocated and/or initialized");
[self.view addSubview:v];
if (v.superview == nil)
NSLog(@"was not added to view");
[super viewDidLoad];
告诉我你得到了什么。
【讨论】:
我怎样才能覆盖init方法来做到这一点?什么是正确的方法标题? 我试着这样写: GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];但是还是不行 您是否进行了任何其他自定义? 感谢@Eytan。调用启用drawRect
的[super initWithFrame:...]
时会发生一些事情。我正在覆盖一个 init 语句并在那里设置框架。如果我将self = [super init]
更改为self = [super initWithFrame:CGRectMake(1,1,1,1)]
,它会起作用。现在我只是重写 initWithFrame 以使其更加透明。【参考方案2】:
检查您的视图是否正在显示。如果视图当前不在屏幕上,即使您将视图添加到其父视图,drawRect
也不会被调用。一种可能是您的视图被其他视图挡住了。
据我所知,你不需要写[super drawRect]
;
请注意,即使在视图控制器上调用viewDidLoad
也不一定表示视图控制器的视图显示在屏幕上。示例:假设视图控制器 A 有一个 ivar,其中存储了视图控制器 B,并且当前显示了视图控制器 A 的视图。还假设 B 已分配和初始化。现在,如果 A 中的某些方法导致 B 的视图被访问,则 B 中的 viewDidLoad
将作为结果被调用,无论它是否显示。
【讨论】:
【参考方案3】:如果您使用的是 CocoaTouch 库或文件,您可能需要覆盖 initWithCoder 方法而不是 viewDidLoad。
目标-C:
- (instancetype)initWithCoder:(NSCoder *)coder
self = [super initWithCoder:coder];
if (self)
//Do Stuff Here
return self;
【讨论】:
【参考方案4】:我有一个屏幕外的视图,我会在屏幕上加载然后重绘。但是,在清理 XCode 中的自动布局约束时,它决定我的屏幕外视图应该有一个框架 (0,0,0,0) (x,y,w,h)。并且使用 (0,0) 大小,视图将永远不会加载。
确保您的 NSView 具有非零帧大小,否则不会调用 drawRect。
【讨论】:
以上是关于简单的 UIView drawRect 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章
drawRect 在 UIView 子类上被调用,但不在 UIViewController 上
如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景