简单的 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 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

UIView 在后台调用 drawRect

drawRect 在 UIView 子类上被调用,但不在 UIViewController 上

iOS UIView drawRect 调整大小动画

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

UIView的layoutSubviews和drawRect方法何时调用

UIView的layoutSubviews和drawRect方法何时调用