简单的UIView drawRect不被调用

我无法弄清楚问题在这里。 我有一个非常简单的viewDidLoad方法非常简单的UIViewController:

-(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方法没有被调用。 我实际上只是试图在屏幕上画一个圆圈。

你有没有尝试在视图的初始化中指定框架? 由于您正在创build一个自定义的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]; 

让我知道你得到什么。

检查您的视图是否正在显示。 如果视图当前不在屏幕上,即使将视图添加到其超级视图, drawRect也不会被调用。 一种可能性是您的视图被其他视图所阻挡。

据我所知,你不需要写[super drawRect] ;

请注意,即使在视图控制器上调用viewDidLoad ,也不一定表示视图控制器的视图显示在屏幕上。 示例:假设视图控制器A具有存储视图控制器B的视觉控制器,并且当前显示视图控制器A的视图。 同样假设B被分配并被定位。 现在,如果A中的某个方法导致B的视图被访问,则B中的viewDidLoad将被调用,而不pipe它是否被显示。

如果您使用的是CocoaTouch库或文件,则可能需要重写initWithCoder方法而不是viewDidLoad。

Objective-C的:

 - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { //Do Stuff Here } return self; } 

我有一个屏幕上的视图,我会加载屏幕上,然后重绘。 但是,在清除XCode中的自动布局约束时,它决定我的离屏视图应该有一个帧(0,0,0,0)(x,y,w,h)。 而(0,0)大小,视图将永远不会加载。

确保您的NSView具有非零的框架大小,否则drawRect将不会被调用。