как избежать переопределения drawRect при отсечении - PullRequest
0 голосов
/ 17 февраля 2012

В данный момент я переопределяю drawRect в представлении, чтобы иметь возможность обрезать цветной прямоугольник с помощью маски (используя CGContextClipToMask внутри 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 );

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

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

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

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

0 голосов
/ 17 февраля 2012

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

...