Вопрос

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

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

Вот мой код:

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

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

Нир.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top