2013-03-15 4 views
0

Я знаю, что есть лучшие способы достижения инструментов рисования с использованием CoreGraphics, а что нет, я использую этот метод UIView, потому что я хочу добиться пиксельного эффекта, и у меня есть некоторые другие специальные вещи в виду, что было бы трудно сделать только с встроенным кодом CG.



У меня есть сетка из 400 UIViews создать свой пикселизированной холст ...
Пользователь выбирает цвет краски и начинает перетаскивать пальцем по полотну 400 UIViews, так как их палец ударяет UIView в цвет этого UIView (aka pixel) изменится на тот цвет, который выбрал пользователь ...

Прямо сейчас я закодировал все это, и все работает, но оно лагги (потому что я использую touchhesMoved), и многие моменты пропущено ...Проверить, когда пользователь скользит по UIView - touchhesMoved too laggy



Я c В настоящее время использование touchsMoved и перемещение UIView в расположение пальцев (я называю это fingerLocationRect).

Когда я обновляю (1 из 400 миниатюрных UIViews) цвет Пиксель, я делаю так, проверяя, если fingerLocationRect является пересечением любой один из моих UIView прямоугольников. Если я обновляю цвет.

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPosition = [touch locationInView:self.view]; 
    fingerLocationRect.center = CGPointMake(currentPosition.x, currentPosition.y); 
    int tagID = 1; 
    while (tagID <= 400) { 
     if(CGRectIntersectsRect(fingerLocationRect.frame, [drawingView viewWithTag:tagID].frame)) { 
      [drawingView viewWithTag:tagID].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f]; 
     } 
     tagID ++; 
    } 
} 



Проблема заключается в том, что touchesMoved не обновляется очень часто ... так что, если я перетащить пальцем по холсту только как 5 из пикселей изменить вместо 40 я на самом деле прикоснулся.



Я интересно, если с помощью CGRectIntersectsRect с touchesMoved является лучшим способом обнаружить, если пользователь горок в UIView ... Сейчас это не обновляется почти достаточно быстро, и я получаю результат слева, а не справа. (Я только достичь эффекта на право, если я пошевелить пальцем очень медленно ...)

enter image description here



Все, что сказал, есть способ обнаружения, когда пользователь скользит по UIView другой чем использовать touchesMoved? Если нет, какие-либо идеи о том, как захватить все UIViews между точками касания, возвращенными touchhesMoved? У меня есть все теги 1-400 (первый ряд 1-10, второй ряд 11-21 и т. Д.)

P.s. если panGestureRecognizer обновляется чаще, чем touchesMoved?


Чтобы получить представление о том, что на 400 UIViews выглядят как здесь все они с arc4random цветов на основе:

enter image description here



ответ

2

Вы перекручивание через 400 просмотров каждый раз touchesMoved: есть называется. Вам просто нужно сделать небольшую математику, чтобы определить, какой вид в сетке касается.Если предположить, что drawingView является «холст» вид, который содержит все 400 «пикселей» и метки упорядочены от верхнего левого угла до нижнего правого, то: повышение производительности

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject];  
    CGPoint point = [touch locationInView:drawingView]; 
    NSInteger column = floorf(20 * point.x/drawingView.bounds.size.width); //20 is the number of column in the canvas 
    NSInteger row = floorf(20 * point.y/drawingView.bounds.size.height); //20 is the number of rows in the canvas 
    [viewWithTag:column + 20*row].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f]; 
} 

Этот метод позволит какао сделать больше частые звонки касанияМод:

+0

Блестящий !! :) :) :) :) Это на самом деле метод, который я могу применить к моим плиткам на основе игр, над которыми я тоже работаю! –