2009-11-04 3 views
1

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

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

Вот мой код:

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; 
} 

Цените ваш бессильного

Nir.

ответ

2

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

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

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

- (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 вообще - вы добавляете и удаляете слои, рисуете то, что вам нравится внутри них, и представление обрабатывает их компоновку вместе и рисует на экране по мере необходимости. Вероятно, больше того, что вы ищете.

+0

Я думаю, вы имеете в виду CALayers вместо UILayers. Ему все равно придется выполнять какой-то пользовательский чертеж в методе drawInContext: CALayer или в методе делегата -drawLayer: inContext :, но вы правы, что слои сохраняют их содержимое до перерисовывания. –

+0

Спасибо, ваше право - я исправил ответ –

1

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

0

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

От iPhone Application Programming Guide:

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