试图理解drawrect中的上下文的范围

时间:2013-11-07 17:41:04

标签: ios objective-c uiview drawrect

我正在尝试了解如何在我的类的实例中保持drawrect使用的值。 下面的示例类绘制了一个三角形。 现在设置它的方式如果使用[[alloc] initWithFrame]创建两个这样的实例,其中两个框架具有不同的大小,您会注意到两个三角形都是以类的第二个实例的大小绘制的。如果您的第一个实例小于第二个实例,它将被其矩形剪切。

  1. 如果我在drawrect中声明tSize,则尺寸将不同(正确)
  2. 如果我在ATriangle.h和@synthesize中声明tSize,则大小会有所不同(正确)
  3. 连续运行两个initWithFrame方法,然后运行两个drawrects,大概来自needsDisplay队列。
  4. 所以我的问题是,范围究竟是如何在drawrect方面工作的,因为我读过的任何教程都没有提及除了最模糊的术语之外的任何内容。他们说只有一个上下文,这两个实例看起来似乎如此,但他们似乎并没有与我的其他类共享。我错过了这条船。到底是怎么回事?

    #import "ATriangle.h"
    
    @implementation ATriangle
    UIColor *divColor;
    
    CGFloat tSize;
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            divColor = [UIColor colorWithWhite:1.0 alpha:0.5];
            self.tSize = (frame.size.width / 3);
    
        }
        return self;
    }
    
    
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
    
    
        CGContextRef context     = UIGraphicsGetCurrentContext();
    
        CGContextSetFillColorWithColor(context, divColor.CGColor);
    
        CGContextMoveToPoint(context,    (rect.size.width / 2), 0);
        CGContextAddLineToPoint(context, (rect.size.width / 2)-tSize, tSize);
        CGContextMoveToPoint(context,    (rect.size.width / 2) , 0);
        CGContextAddLineToPoint(context, (rect.size.width / 2)+tSize, tSize);
        CGContextAddLineToPoint(context, (rect.size.width / 2)-tSize, tSize);
    
        CGContextFillPath(context);
    }
    
    
    @end
    

1 个答案:

答案 0 :(得分:1)

问题在于divColortSize。您已将它们声明为文件全局变量,而不是实例变量。这意味着该类的每个实例都共享相同的变量副本。

你想要这个:

@implementation ATriangle {
    UIColor *divColor;
    CGFloat tSize;
}

这将使变量成为私有实例变量而不是文件全局变量。