drawRect 适合动画代码吗?

Posted

技术标签:

【中文标题】drawRect 适合动画代码吗?【英文标题】:drawRect appropriate for animation code? 【发布时间】:2013-02-18 05:41:28 【问题描述】:

我将动画代码放在 UIView 子类的 drawRect 中。我真的在寻找类似 UIViewController 的 viewWillAppear 的东西。但我想使用 UIView 而不是 UIViewController。我正在使用下面的代码。将动画代码放在drawRect中是否合适?动画只是显示视图时的启动动画。

- (void)drawRect:(CGRect)rect


    [_graphView setFrame:CGRectMake(0.0f, 0.0f, 30.0 + (_defaultArray.count * STEP_X), self.frame.size.height)];
    [self setContentSize:CGSizeMake(30.0 + (_defaultArray.count * STEP_X), _graphView.frame.size.height)];

    float delayInSeconds = 0.25f;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)

        if (_graphView.frame.size.width > GRAPH_WIDTH) [self setContentOffset:CGPointMake(_graphView.frame.size.width - GRAPH_WIDTH, 0.0f) animated:YES];

    );

【问题讨论】:

恕我直言,动画代码不属于drawRect。该例程应该只有在任何给定时间段内绘制视图所需的代码。如果你想做复杂的动画,我会在其他地方做(并使用CADisplayLink 或重复NSTimer)。 不,drawRect 应该用于绘制动画的一帧,而CADisplayLink 应该用于重复更新值和重绘。 【参考方案1】:

不,这是一个糟糕的主意。在-drawRect: 的实现中,您唯一应该做的就是绘制视图的内容。您的任何代码都没有做任何类似的事情。

(如果此视图是UIScrollView 的子类,您可能根本不应该覆盖-drawRect:。)

该代码看起来更适合在视图控制器中,或者在视图的设置代码中(它会创建 _graphView 本身吗?)。如果不了解其余代码的更多信息,很难准确地建议它属于哪里。

【讨论】:

以上是关于drawRect 适合动画代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过循环 drawRect 动画自定义贝塞尔路径

我想动画,事实上淡化,“内”drawRect

为啥drawRect的空实现:会对动画期间的性能产生不利影响

在 drawRect 上动画创建 cgrect 不起作用

iOS UIView drawRect 调整大小动画

在 iOS 上,如果一个视图有多个层,drawRect 可以只选择一个层来显示吗?