【问题标题】:Simple UIView drawRect not being called简单的 UIView drawRect 没有被调用
【发布时间】: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,看看是否有任何不同。

标签: ios uiview


【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        相关资源
        最近更新 更多