2012-02-17 3 views
0

В настоящий момент я переопределяю drawRect на вид, чтобы иметь возможность закрепить цветной прямоугольник с помощью маски (используя CGContextClipToMask внутри drawRect). Иногда я меняю цвет этого обрезанного прямоугольника. В этом случае drawRect снова вызывается, перерисовывая и обрезая прямоугольник новым цветом. Теперь я не хочу менять цвет сразу, но оживить его. Проблема заключается в том, что анимация не выполняется при переопределении drawRect (drawRect получает только один раз и сразу).как избежать переопределения drawRect при обрезке

Есть ли способ выполнить эту анимацию, возможно, путем подклассификации представления, чтобы я по-прежнему переопределял drawRect в суперклассе, но анимация каким-то образом выполняется через подкласс, так что drawRect из суперкласса выполняется несколько раз во время анимация?

Или также невозможно переопределить drawRect и все еще быть в состоянии скопировать этот прямоугольник с помощью маски как-нибудь? drawRect выглядит примерно так:

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGImageRef maskImage = [[UIImage imageNamed:maskName] CGImage]; 
CGContextClipToMask(ctx, rect, maskImage); 

CGContextSetFillColorWithColor(ctx, self.currentColor); 
CGContextFillRect(ctx, rect); 

ответ

0

Я считаю, что лучше использовать CALayer, чтобы замаскировать свой вид (не забудьте импортировать QuartzCore):

maskLayer.contents = (id)[UIImage imageNamed:maskName].CGImage; // maskLayer is a CALayer 
view.layer.mask = maskLayer; 

Теперь если у вас есть метод -(void)animate в контроллере представления, вы должны выполнить его несколько раз с использованием таймера или с использованием рекурсивных вызовов до performSelector:withObject:afterDelay.

+0

Удивительный, с вашим подходом мне не пришлось переопределять drawRect, чтобы я мог наконец использовать анимацию. Мне не нужно было использовать таймер или рекурсивно выполнять метод анимации, потому что теперь я могу использовать стандартный CoreAnimation. Большое спасибо! Следует отметить, что вам нужно использовать png-изображения или некоторые изображения с четким цветом (черные и белые маски больше не работают, но это не проблема). Также вы должны установить фрейм слоя в рамки вида, который вы хотите скрыть, используя maskLayer.frame = [self bounds]; – JayAr

0

Одним из решений было бы иметь таймер, который стреляет перерисовывать несколько раз в течение долгого времени, когда цвет меняется. Когда пользователь выбирает новый цвет, запустите NSTimer, скажем, 10 раз в секунду. Когда срабатывает таймер, обновите текущий цвет, который будет частично от начала до конца, и сделайте недействительным представление. После того, как вы достигнете финального цвета, убейте таймер.

+0

спасибо, похоже, что он должен работать, но также звучит как-то как изобретать колесо (анимацию). Если нет другого варианта, я буду использовать это. – JayAr

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