Как обновить мой пользовательский UIView с drawRect? - PullRequest
2 голосов
/ 01 июня 2011

Я пытаюсь создать некоторые приложения для iOS во время обучения, и у меня возникают проблемы с пониманием правильного способа сделать это.

В настоящее время у меня есть представление, которое является подклассом UIView. Это понятно, и я хочу использовать его как поверхность для рисования. Он будет лежать поверх чего-то другого, например, кальки.

Пользователь должен иметь возможность щелкнуть одну точку, затем другую, и между двумя точками должна начертиться линия. Я получаю данные касания, у меня есть точки, и я могу рисовать вещи изнутри drawRect: первоначально.

Проблема в том, что я не уверен, как обновить вещи позже. Когда все загрузится и drawRect: будет вызвано, он просто нарисует линию. Но как мне заставить его рисовать новые вещи или изменять вещи, которые уже нарисованы, основываясь на том, что делает пользователь? Я знаю, что мне нужно вызвать setNeedsDisplay, но не то, как получить данные для представления для рисования.

Я прочитал кучу уроков / примеров, и все они остановились на «Переопределить drawRect: и нарисовать некоторые вещи ... готово!». Как передать данные в представление, чтобы сказать «эй, перерисовать этот материал и добавить эту новую строку».

Или я поступаю неправильно?

EDIT: Я постараюсь лучше объяснить настройки, которые у меня есть.

У меня есть ВК. В представлении этого ВК у меня есть панель инструментов внизу. Остальная часть области занята 2 представлениями. Одним из них является вид изображения, который содержит контрольное изображение. Одним из них является пользовательский вид (калька), который находится сверху. Они нажимают кнопку на панели инструментов, которая включает распознаватель жестов. Они нажимают на экран, и я собираю данные касания, выключаю распознаватель жестов и НАДЕЖНО рисую линию. У меня все работает, кроме рисования.

1 Ответ

4 голосов
/ 01 июня 2011

Вы на правильном пути.Похоже, вам нужно следить за точками.

Вот несколько примеров кода.

LineDrawView.h

#import <UIKit/UIKit.h>
@interface LineDrawView : UIView 
{
    NSMutableArray *lines;
    CGPoint pointA, pointB;
    BOOL activeLine;
}
@end

LineDrawView.m

#import "LineDrawView.h"
@implementation LineDrawView
- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        self.backgroundColor = [UIColor blackColor];
        lines = [[NSMutableArray alloc] init];
    }
    return self;
}
- (void)dealloc 
{
    [lines release];
    [super dealloc];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    CGPoint point = [[touches anyObject] locationInView:self];
    if ([lines count] == 0) pointA = point;
    else pointB = point;
    activeLine = YES;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    pointB = [[touches anyObject] locationInView:self];
    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    pointB = [[touches anyObject] locationInView:self];
    [lines addObject:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:pointA], [NSValue valueWithCGPoint:pointB], nil]];
    pointA = pointB;
    pointB = CGPointZero;
    activeLine = NO;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(c, 2);
    CGContextSetLineCap(c, kCGLineCapRound);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetStrokeColorWithColor(c, [UIColor grayColor].CGColor);
    for (NSArray *line in lines)
    {
        CGPoint points[2] = { [[line objectAtIndex:0] CGPointValue], [[line objectAtIndex:1] CGPointValue] };
        CGContextAddLines(c, points, 2);
    }
    CGContextStrokePath(c);
    if (activeLine)
    {
        CGContextSetStrokeColorWithColor(c, [UIColor whiteColor].CGColor);
        CGPoint points2[2] = { pointA, pointB };
        CGContextAddLines(c, points2, 2);
        CGContextStrokePath(c);
    }
}
@end
...