Кварц 2d пытается перерисовать треугольник - PullRequest
1 голос
/ 30 мая 2011

Я разрабатываю приложение для iPhone.

У меня есть следующий класс:

#import "Triangulo.h"


@implementation Triangulo

@synthesize minusValue;


- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    CGSize size = rect.size;
    CGPoint origin = {10.0f, size.height - 10.0f};
    [self drawLineAtOrigin:origin withLength:size.width - 10.0f];

    CGPoint origin2 = {10.0f, size.height - 20.0f};
    CGSize size2 = {size.width - minusValue, 20.0f};
    [self drawTriangleAtOrigin:origin2 withSize: size2 inRect: rect];
}

- (void)drawLineAtOrigin:(CGPoint)origin withLength:(float)length {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    CGContextMoveToPoint(context, origin.x, origin.y);
    CGContextAddLineToPoint(context, length, origin.y);
    CGContextStrokePath(context);
}

- (void)drawTriangleAtOrigin:(CGPoint)origin withSize:(CGSize)size inRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextClearRect(UIGraphicsGetCurrentContext(), rect);

    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);

    CGContextMoveToPoint(context, origin.x, origin.y);
    CGContextAddLineToPoint(context, size.width, origin.y);
    CGContextAddLineToPoint(context, size.width, origin.y - size.height);
    CGContextAddLineToPoint(context, origin.x, origin.y);
    CGContextFillPath(context);
    CGContextStrokePath(context);

}

- (void)dealloc {
    [super dealloc];
}


@end

Этот UIView является частью UIViewController.view.Я добавил в UIViewController.h как:

IBOutlet Triangulo *triangulo;

...

@property (nonatomic, retain) IBOutlet Triangulo *triangulo;

В UIViewController у меня есть кнопка для изменения Triangulo:

- (IBAction)btnDrawTriangleClicked:(id)sender {

    triangulo.minusValue += 10.0f;

    CGRect rect = CGRectMake(0, 0, 280, 50);

    [triangulo drawRect: rect];
}

Но я ничего не могу нарисовать, потому что UIGraphicsGetCurrentContextвсегда ноль.

Любой совет?

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Добавьте этот код к вашему Triangulo классу:

- (void)setMinusValue:(double)aMinusValue {
    minusValue = aMinusValue;
    [self setNeedsDisplay];
}

И затем метод btnDrawTriangleClicked: к следующему:

- (IBAction)btnDrawTriangleClicked:(id)sender {
    triangulo.minusValue += 10.0f;
}

Теперь, когда вы изменяете minusValue, Triangulo автоматически помечается как нужное повторное отображение. (См. Цикл просмотра чертежа для получения дополнительной информации). Как сказал Дипак, вы никогда не вызываете drawRect: самостоятельно (если только вы не находитесь внутри самого метода drawRect: и не вызываете [super drawRect:frame];). Метод drawRect: автоматически вызывается системой, и он всегда обеспечивает предварительную настройку действительного CGGraphicsContext. Поскольку вы называли это напрямую, эта подготовительная работа не выполнялась, поэтому UIGraphicsGetCurrentContext() обычно возвращали NULL.

1 голос
/ 30 мая 2011

Вы никогда не должны звонить drawRect: напрямую. Вы должны вызывать setNeedsDisplay или setNeedsDisplayInRect: всякий раз, когда вы хотите перерисовать представление. rect, которое передается drawRect:, не является случайным значением, которое передается. Он сообщает вам часть границ представления, которые необходимо перерисовать.

...