0

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

  1. 如果我在 drawrect 中声明 tSize 大小将不同(正确)
  2. 如果我在 ATriangle.h 和 @synthesize 中声明 tSize 大小将不同(正确)
  3. 两个initWithFrame方法连续运行,然后运行两个drawrect,大概来自needsDisplay队列。

所以我的问题是,关于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
4

1 回答 1

1

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

你要这个:

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

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

于 2013-11-07T17:52:33.987 回答