Линия стирается при рисовании фигур

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

Я могу провести линию от одной точки к другой, но она стирается при каждом новом рисовании.

Вот мой код:

CGPoint location;
CGContextRef context;
CGPoint drawAtPoint;
CGPoint lastPoint;
-(void)awakeFromNib{
    //[self addSubview:noteView];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    location = [touch locationInView:touch.view];
    [self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)];
}

- (void)drawRect:(CGRect)rect {
    context = UIGraphicsGetCurrentContext();
    [[UIColor blueColor] set];
    CGContextSetLineWidth(context,10);
    drawAtPoint.x =location.x;
    drawAtPoint.y =location.y;
    CGContextAddEllipseInRect(context,CGRectMake(drawAtPoint.x, drawAtPoint.y, 2, 2));
    CGContextAddLineToPoint(context,lastPoint.x, lastPoint.y);
    CGContextStrokePath(context);

    lastPoint.x =location.x;
    lastPoint.y =location.y;
}

Ценю вашу помощь-

Нир.


person Tiger    schedule 04.11.2009    source источник


Ответы (3)


Как вы уже обнаружили, -drawRect — это место, где вы отображаете содержимое представления. Вы будете «видеть» на экране только то, что рисуете здесь.

Это гораздо более низкоуровневый подход, чем что-то вроде Flash, где вы можете добавить мувиклип, содержащий строку, на сцену, а через некоторое время добавить еще один мувиклип, содержащий строку, и вот вы видите — две строки!

Вам нужно будет проделать некоторую работу и, возможно, настроить что-то вроде ..

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 
    location = [touch locationInView:touch.view]; 

    [self addNewLineFrom:lastPoint to:location];

    lastPoint = location;

    [self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)]; 
}

- (void)drawRect:(CGRect)rect {

    context = UIGraphicsGetCurrentContext();

    for( Line *eachLine in lineArray )
        [eachLine drawInContext:context];

}

Я думаю, вы можете увидеть, как конкретизировать это до того, что вам нужно.

Другой способ приблизиться к этому — использовать CALayers. Используя этот подход, вы вообще не рисуете внутри - (void)drawRect - вы добавляете и удаляете слои, рисуете внутри них то, что вам нравится, а представление будет обрабатывать их компоновку и рисование на экране по мере необходимости. Вероятно, больше того, что вы ищете.

person Community    schedule 04.11.2009
comment
Я думаю, вы имеете в виду CALayers вместо UILayers. Ему по-прежнему придется выполнять некоторый пользовательский рисунок в методе CALayer drawInContext: или методе делегата -drawLayer:inContext:, но вы правы в том, что слои сохранят свое содержимое до тех пор, пока они не будут перерисованы. - person Brad Larson; 04.11.2009

Каждый раз, когда вызывается drawRect, вы начинаете с чистого листа. Если вы не отслеживаете все, что вы нарисовали ранее, чтобы нарисовать это снова, то в конечном итоге вы нарисуете только последний мазок пальца, а не любой из старых. Вам придется отслеживать все движения пальцев, чтобы перерисовывать их каждый раз, когда вызывается drawRect.

person mahboudz    schedule 04.11.2009

Вместо того, чтобы перерисовывать каждую строку, вы можете нарисовать изображение, а затем просто отобразить изображение в своем методе drawRect:. Изображение будет накапливать линии для вас. Конечно, этот метод усложняет реализацию отмены.

Из Руководство по программированию приложений для iPhone:

Используйте функцию UIGraphicsBeginImageContext для создания нового графического контекста на основе изображения. После создания этого контекста вы можете нарисовать в нем содержимое вашего изображения, а затем использовать функцию UIGraphicsGetImageFromCurrentImageContext для создания изображения на основе того, что вы нарисовали. (При желании вы можете даже продолжить рисование и создать дополнительные изображения.) Когда вы закончите создание изображений, используйте функцию UIGraphicsEndImageContext, чтобы закрыть графический контекст. Если вы предпочитаете использовать Core Graphics, вы можете использовать функцию CGBitmapContextCreate, чтобы создать контекст растровой графики и нарисовать в нем содержимое вашего изображения. Когда вы закончите рисовать, используйте функцию CGBitmapContextCreateImage, чтобы создать CGImageRef из контекста растрового изображения. Вы можете нарисовать изображение Core Graphics напрямую или использовать его для инициализации объекта UIImage.

person TechZen    schedule 04.11.2009