2009-08-09 2 views
3

Я делаю простую программу рисования iPhone в качестве личного побочного проекта.Простое приложение для рисования iPhone с кварцем 2D

Я фиксирую событие прикосновения в подклассе UIView и выставляю фактический материал отдельному CGLayer. После каждого рендеринга я вызываю [self setNeedsLayout] и в методе drawRect: я рисую CGLayer в контекст экрана.

Все это прекрасно работает и подходит для рисования прямоугольников. Тем не менее, я просто хочу простой режим «свободной руки», как и многие другие приложения для iPhone.

Как я думал, что сделать это было создать CGMutablePath, а просто:

 
CGMutablePathRef path; 
-(void)touchBegan { 
    path = CGMutablePathCreate(); 
} 
-(void)touchMoved { 
    CGPathMoveToPoint(path,NULL,x,y); 
    CGPathAddLineToPoint(path,NULL,x,y); 

} 
-(void)drawRect:(CGContextRef)context { 
     CGContextBeginPath(context); 
     CGContextAddPath(context,path); 
     CGContextStrokePath(context); 
} 

Однако после нанесения более чем на 1 секунду, производительность падает с треском.

Я бы просто рисовал каждую строку в экранном CGLayer, если бы не переменная непрозрачность! Прозрачность менее 100% заставляет точки оставаться на экране, соединяющем линии. Я посмотрел на CGContextSetBlendingMode(), но, увы, я не могу найти ответ.

Может ли кто-нибудь указать мне в правильном направлении? Другие приложения для iPhone могут сделать это с очень хорошей эффективностью.

ответ

1

Проблема заключается в том, что с текущим изменяемым путем закрывается и нарисован, и при перемещении пальца создается новый путь. Таким образом, вы, вероятно, закончите с большим количеством путей для сеанса с одним касанием, по крайней мере, это то, что, по-вашему, делает ваш псевдокод.

Вы можете попробовать начать новый изменяемый путь, когда начнется касание, используйте CGAddLineToPoint(), когда касание перемещается и заканчивается путь, когда он заканчивается (как показано на вашем псевдокоде). Но в методе рисования вы нарисуете экземпляр текущего измененного пути, и фактический измененный путь все еще удлиняется до тех пор, пока не коснется конца, так что вы получите только один путь для всего сеанса касания. После завершения штрихов вы можете добавить путь навсегда - вы можете, например, поместить все пути в массив и перебрать их в методе рисования.

1

Что сказал СанХоло - плюс вы можете активировать добавление очков, поэтому он добавляет новую точку не чаще, чем каждые 10 мс, скажем (вам нужно будет играть с интервалом). Вы можете сделать это с помощью простого таймера.

Кроме того, как вы инструктируете представление, которое нужно перерисовать? Возможно, вам захочется и дросселировать это - и это может быть на более длительном интервале, чем захват точки (например, точки захвата не более, чем каждые 10 мс, и перерисовывать не чаще, чем каждые 200 мс - снова вам нужно будет играть с цифрами) ,

В обоих случаях вам необходимо убедиться, что, если ничего не происходит дольше, чем интервал, отснятый последней точкой, или требуется перерисовать. Вот где входит таймер.

Смежные вопросы