剪裁时如何避免覆盖drawRect

时间:2012-02-17 16:59:15

标签: objective-c ios animation drawrect clip

目前我在视图中覆盖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 :(得分:0)

一种解决方案是使用一个计时器,只要颜色发生变化,就会随着时间的推移重复重绘。当用户选择一种新颜色时,将一个NSTimer标记为发射,例如每秒10次。当计时器触发时,将当前颜色更新为从开始到结束颜色的中途,并使视图无效。达到最终颜色后,杀死计时器。

答案 1 :(得分:0)

我认为最好使用CALayer来掩盖你的视图(不要忘记导入QuartzCore):

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

现在假设您的视图控制器中有一个方法-(void)animate,您可以使用计时器或使用performSelector:withObject:afterDelay的递归调用多次执行它。