2

我目前正在构建 Custom UIActivityIndicator。为了做到这一点,我创建了以下绘制矩形函数:

-(void) drawRect:(CGRect)rect  
{
CGPoint point;
NSLog(@"here %d",stage);`

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, 2.0);

for (int i = 1 ; i<=10; ++i) {


    CGContextSetStrokeColorWithColor(ctx, [[self getColorForStage:stage+i WithAlpha:0.1 *i] CGColor]);
    point = [self pointOnOuterCirecleWithAngel:stage+i];
    CGContextMoveToPoint(ctx, point.x, point.y);
    point = [self pointOnInnerCirecleWithAngel:stage+i];
    CGContextAddLineToPoint( ctx, point.x, point.y);
    CGContextStrokePath(ctx);
}



stage++;
}

我加了一个NSTimer电话[self setNeedsDisplay];

动画效果很好,但是当我将它导入到我的应用程序时,每次我滚动表格或做任何动画都会停止,直到表格停止移动。

我假设只有在 UI 完成更新后才更新我的 DrawRect 但我该如何解决它或以正确的方式做

4

3 回答 3

3

如果您希望它在表格视图(或任何其他滚动视图)滚动时触发,您必须使用不同的运行循环模式手动安排您的计时器。默认情况下,滚动时不会触发计时器以提高性能。

NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

(你会得到默认行为NSDefaultRunLoopMode而不是NSRunLoopCommonModes。)

于 2013-06-04T23:15:33.200 回答
1

如果您描述了您想要的结果会是什么样子,那将会有所帮助。通过查看代码,您似乎正在尝试实现多色环。你指的是动画,但这里没有真正的动画。它可能看起来是动画的,基于让它每隔一段时间重新绘制,但我什至不确定这是怎么发生的。如果它每次都重绘完全相同的东西,你将看不到任何看起来像运动的东西。每次处理 drawRect 时,您调用的方法 (getColorForStage和) 是否为相同的参数返回不同的结果?pointOnOuterCirecleWithAngel

您不应该使用 drawRect 来实现动画。drawRect 应该使您的视图看起来像它应该看起来的那样,然后什么都不做,直到再次需要它为止。通常根本不需要再次调用它,除非视图被隐藏并且操作系统回收了保存其像素的内存。的目的setNeedsDisplay是触发 drawRect 被再次调用,因为视图表示的信息已经改变,而不是更新相同数据的正在进行的动画。您可以通过许多不涉及再次运行 drawRect 的方式更改视图的外观,例如更改其大小、位置、alpha 或旋转它。

如果在平移和缩放期间没有调用 drawRect,我不会感到惊讶,并且调用setNeedsDisplay会排队直到调整视图之后。

您应该使用核心动画。希望核心动画在平移和缩放期间继续运行。您应该能够通过一次调用 drawRect 绘制图标然后使用 Core Animation 旋转它或其他东西来实现您想要的那种效果。

于 2013-06-04T22:56:04.093 回答
1

[self setNeedsDisplay]; 你不应该在视图 didload 中调用Do it

于 2013-12-22T09:36:10.443 回答