2011-06-07 33 views
6

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

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

+0

将'[self.view bringSubviewToFront:v];'添加到'viewDidLoad'并查看它是否有任何区别。 – 2011-06-07 21:26:41

+0

没有区别.. – CodeGuy 2011-06-07 21:30:32

回答

12

您是否尝试过在视图的初始化中指定框架?由于您正在创建自定义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]; 

让我知道你会得到什么。

+0

我该如何重写init方法来做到这一点?什么是适当的方法标题? – CodeGuy 2011-06-07 21:13:26

+0

我尝试使它像这样:GameView * v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];但它仍然不起作用 – CodeGuy 2011-06-07 21:14:59

+0

你有没有做过其他的定制? – Eytan 2011-06-07 21:23:58

0

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

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

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

0

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

目的-C:

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

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

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