简单的UIView drawRect没有被调用
我无法弄清楚问题在这里。我有一个非常简单的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方法。我实际上只是试图在屏幕上画一个圆圈。
您是否尝试过在视图的初始化中指定框架?由于您正在创建自定义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的视图的ivar。同样假设B被分配并被引用。现在,如果A中的某个方法导致B的视图被访问,则B中的将被作为结果调用,而不管它是否被显示。
如果您使用的是CocoaTouch库或文件,您可能需要重写initWithCoder方法而不是viewDidLoad。
目的-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将不会被调用。
将'[self.view bringSubviewToFront:v];'添加到'viewDidLoad'并查看它是否有任何区别。 – 2011-06-07 21:26:41
没有区别.. – CodeGuy 2011-06-07 21:30:32