UIView 子类:drawRect 未调用

Posted

技术标签:

【中文标题】UIView 子类:drawRect 未调用【英文标题】:UIView subclass: drawRect not called 【发布时间】:2012-03-31 14:06:46 【问题描述】:

我是 ios 编程的初学者,如果我的问题是一个愚蠢的问题,请见谅。

我正在尝试制作一个在加载的图像上执行自定义绘图的应用程序。

为此,我发现一个解决方案是将UIView 子类化并编辑drawRect 方法。

我在下面的代码中实现了这一点,该代码在链接到 Interface Builder 故事板文件中的按钮的IBAction 上激活。

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:     @"SampleImage.jpg"]]; 
image.frame = previewView.frame;
[image setContentMode:UIViewContentModeScaleAspectFit];       

[previewView addSubview:image];

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)];
[previewView addSubview:aCustomView];

customView 是我创建的UIView 子类,其initdrawRect 方法设置如下:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    NSLog(@"INITIALIZING");
    if (self) 
        // Initialization code
        [self setBackgroundColor:[UIColor clearColor]];
    
    return self;



- (void)drawRect:(CGRect)rect

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    NSLog(@"DRAWING");

    CGContextClearRect(ctx, rect);

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3);
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1);
    CGContextSetLineWidth(ctx, 2);
    CGContextStrokeEllipseInRect(ctx, rect);

我遇到的问题是没有绘图,在NSLog 我有“INITIALIZING”消息,但没有“DRAWING”绘图。

所以基本上它生成了initWithFrame,但它不调用drawRect 方法。

你能指出我做错了什么吗?

【问题讨论】:

【参考方案1】:
    确保您的新视图类是 UIView 的子类,而不是 UIImageView。 为确保显示新视图,您需要执行 [viewContainer addSubView:] 以调用 drawRect。

来自文档的参考:

UIImageView 类经过优化,可以将其图像绘制到显示器上。 UIImageView 不会调用 drawRect: 一个子类。如果您的子类需要自定义绘图代码,建议您使用 UIView 作为基类。

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

【讨论】:

你可以设置自定义类覆盖绘制矩形到编码器【参考方案2】:

保罗,

您可以尝试以下几点:

    initWithFrame 中,检查frame 变量是否包含您的 期望它: NSLog(@"Frame: %@", NSStringFromCGRect(frame));[preview setNeedsDisplay]; 添加到其父视图后尝试调用它

最后,我会改变

image.frame = previewView.frame;

与:

image.bounds = CGRectMake(0, 0, previewView.frame.size.width, previewView.frame.size.height);

【讨论】:

谢谢,通过放置NSLog,我发现drawRect方法的调用有问题。通过添加 [previewView setNeedDisplay] 该方法被调用,但不是在我期望它完成时。我的意思是,通过以下代码步骤,[previewView setNeedDisplay] 行的执行不会使自定义绘图出现,而是稍后以某种方式出现。我想知道drawRect方法是在什么时候被调用的,但无论如何最初的问题已经解决了,谢谢:)【参考方案3】:

问题可能是自定义视图的框架是 (0,0,0,0)。 您可以尝试传递一个常量 CGRect 参数,如下所示:CGRectMake(5, 5, 100, 100)。

【讨论】:

【参考方案4】:

我的答案与我读过的所有类似问题的答案都不同,也许会对其他人有所帮助。事实证明,在我的故事板上,“从目标继承模块”未选中,而同时模块为无。我添加了复选标记,并在下次运行应用程序时调用了 draw 方法。

【讨论】:

以上是关于UIView 子类:drawRect 未调用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

MKPinAnnotationView 子类上未调用 drawRect

加速 -drawRect: UIView 子类的方法

如果初始帧为 CGRectZero,则不会调用自定义 UIView 的 drawRect

更新 UIView 子类中 drawRect 中绘制的组件中的文本