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

时间:2011-05-27 18:56:01

标签: ios uiview

我有一个非常简单的UIView自定义子类:

#import "BarView.h"
#import <QuartzCore/QuartzCore.h>

@implementation BarView

@synthesize barColor;

- (void)drawRect:(CGRect)rect
{
    NSLog(@"drawRect");
    // Draw a rectangle.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, self.barColor.CGColor);
    CGContextBeginPath(context);
    CGContextAddRect(context, self.bounds);
    CGContextFillPath(context);
}

- (void)dealloc
{
    self.barColor = nil;

    [super dealloc];
}

@end

如果我在这个类上使用一些非零的rect调用initWithFrame:rect,它可以正常工作;但是当我调用initWithFrame:CGRectZero时,即使我将视图的框架修改为非零的矩形,也会调用drawRect。

我当然明白为什么一个零帧的视图永远不会有它的drawRect:被调用,但是为什么它甚至在帧被改变之后才被调用?

2 个答案:

答案 0 :(得分:26)

快速浏览一下Apple文档说这个

  

更改框架矩形会自动重新显示视图而不调用其drawRect:方法。如果您希望UIKit在框架矩形更改时调用drawRect:方法,请将contentMode属性设置为UIViewContentModeRedraw。

这是在框架属性的文档中:
https://developer.apple.com/documentation/uikit/uiview/1622621-frame?language=objc

如果你想让视图重绘,只需在它上面调用setNeedsDisplay就可以了(或者,正如文档所说,你可以将它设置为UIViewContentModeRedraw,但这取决于你)

答案 1 :(得分:1)

在Swift 5中

override init(frame: CGRect) {
      super.init(frame: frame)

      contentMode = UIView.ContentMode.redraw