如何正确使用 DrawRect
Posted
技术标签:
【中文标题】如何正确使用 DrawRect【英文标题】:How to use DrawRect correctly 【发布时间】:2013-06-04 17:00:27 【问题描述】:我目前正在构建自定义 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 但我该如何解决它或以正确的方式进行操作
【问题讨论】:
Angle 是旋转的量度,而 Angel 是天上的行善者(有翅膀和光环)。此外,circle 没有中间的“e”。 【参考方案1】:如果您希望在表格视图(或任何其他滚动视图)滚动时触发计时器,则必须使用不同的运行循环模式手动安排计时器。默认情况下,滚动时不会触发计时器以提高性能。
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
(你会得到NSDefaultRunLoopMode
而不是NSRunLoopCommonModes
的默认行为。)
【讨论】:
完美运行!您认为在 draw rect 方法上放置一个计时器是最佳实践吗?还是有正确的方法来实现这样的目标?【参考方案2】:如果您描述了您想要的结果会是什么样子,那将会有所帮助。通过查看代码,您似乎正在尝试实现多色环。你指的是动画,但这里没有真正的动画。它可能看起来是动画的,基于让它每隔一段时间重新绘制,但我什至不确定这是怎么发生的。如果它每次都重绘完全相同的东西,你将看不到任何看起来像运动的东西。每次处理 drawRect 时,您调用的方法(getColorForStage
和 pointOnOuterCirecleWithAngel
)是否针对相同的参数返回不同的结果?
你不应该使用 drawRect 来实现动画。 drawRect 应该使您的视图看起来像它应该看起来的那样,然后什么都不做,直到再次需要它为止。通常根本不需要再次调用它,除非视图被隐藏并且操作系统回收了保存其像素的内存。 setNeedsDisplay
的目的是触发 drawRect 被再次调用,因为视图表示的信息已经改变,而不是更新相同数据的正在进行的动画。您可以通过许多不涉及再次运行 drawRect 的方式更改视图的外观,例如更改其大小、位置、alpha 或旋转它。
如果在平移和缩放期间没有调用 drawRect,我不会感到惊讶,并且对 setNeedsDisplay
的调用会排队等待视图调整之后。
您应该使用核心动画。希望核心动画在平移和缩放期间继续运行。您应该能够通过一次调用 drawRect 绘制图标然后使用 Core Animation 旋转它或其他方式来实现您想要的效果。
【讨论】:
【参考方案3】:你不应该打电话给[self setNeedsDisplay];
在视图 didload 中执行此操作
【讨论】:
以上是关于如何正确使用 DrawRect的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 Composer 安装 Laravel 扩展包