如何正确使用 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 时,您调用的方法(getColorForStagepointOnOuterCirecleWithAngel)是否针对相同的参数返回不同的结果?

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

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

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

【讨论】:

【参考方案3】:

你不应该打电话给[self setNeedsDisplay]; 在视图 didload 中执行此操作

【讨论】:

以上是关于如何正确使用 DrawRect的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Composer 安装 Laravel 扩展包

如何正确的使用SharedPreferences

如何正确强制正确使用类方法?

如何正确使用 Composer 安装 Laravel 扩展包

如何正确使用 AsyncTask? [关闭]

如何正确的使用QWebEngineView