Как нарисовать линию на сенсорном событии? - PullRequest
2 голосов
/ 12 января 2011

Эй, я новичок в цели C Пожалуйста, помогите мне

Я делаю следующий код, но не работаю .....

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

UITouch *touch = [touches anyObject];
if ([touch view] == self.view) {

    CGPoint location = [touch locationInView:self.view];
    loc1 = location;
    CGContextMoveToPoint(context, location.x, location.y);
    NSLog(@"x:%d y:%d At Touch Begain", loc1.x, loc1.y);
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{
    UITouch *touch = [touches anyObject];

        if ([touch view] == self.view) 
    {
    CGPoint location = [touch locationInView:self.view];
    CGContextMoveToPoint(context, loc1.x, loc1.y);
    NSLog(@"x:%d y:%d At Touch Move", loc1.x, loc1.y);
    CGContextAddLineToPoint(context, location.x, location.y);
    NSLog(@"x:%d y:%d", location.x, location.y);
}

}

Я объявляю contextx в методе viewdidload, а также пытаюсь объявитьв сенсорном событии, но не работает ...

Файл журнала моего приложения выглядит как ...

x: 0 y: 1079934976 При касании Переместить Чт 13 января 11:20:05.local DragDrop [536]:

CGContextAddLineToPoint: недопустимый контекст 0x0 2011-01-13 11: 20: 05.149 DragDrop [536: 207] x: 0 y: 1079902208 Чт 13 января 11:20:05 .localDragDrop [536]:

CGContextSetRGBStrokeColor: недопустимый контекст 0x0 чт 13 января 11:20:05 .local DragDrop [536]:

CGContextDrawPath: недопустимый контекст 0x0 чт 13 января 11:20:05.local DragDrop [536]:

CGContextMoveToPoint: недопустимый контекст 0x0 2011-01-13 11: 20: 05.199 DragDrop [536: 207] x: 0 y: 1079934976 При касании Переместить Чт 13 января 11:20:05 .local DragDrop [536]:

CGContextAddLineToPoint: недопустимый контекст 0x0 2011-01-13 11: 20: 05.200 DragDrop [536: 207] x: 0 y: 1079885824

Ответы [ 3 ]

13 голосов
/ 13 января 2011

Обычно вы не рисуете напрямую в методах обнаружения касания.Обычно вы просто сохраняете новые точки / линии и рисуете их все в drawRect:.Предположим, у вас есть пользовательский подкласс UIView, который имеет переменную экземпляра paths типа NSMutableArray и свойство currentPath типа UIBezierPath.Затем вы можете реализовать методы обнаружения касания и drawRect примерно так:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  self.currentPath = [UIBezierPath bezierPath];
  currentPath.lineWidth = 3.0;
  [currentPath moveToPoint:[touch locationInView:self]];
  [paths addObject:self.currentPath];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  [self.currentPath addLineToPoint:[touch locationInView:self]];
  [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
  [[UIColor redColor] set];
  for (UIBezierPath *path in paths) {
    [path stroke];
  }
}

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

1 голос
/ 13 декабря 2012

используйте мой ответ, он рисует линию (свободная рука).

Невозможно включить отмену / повтор с гладким рисунком свободной руки

надеюсь, это поможет

0 голосов
/ 12 января 2011

Вам необходимо вызвать CGContextStrokePath после вызова AddLineToPoint. Обязательно сначала определите цвет контура обводки.

CGContextSetRGBStrokeColor(context,0,0,1,1);
CGContextStrokePath(context);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...