在iOS上,自定义视图不会动画?

时间:2012-09-17 06:54:09

标签: iphone ios uiview core-animation uiviewanimation

在新的单一视图应用程序中,以下代码:

- (void)viewDidAppear:(BOOL)animated {
    self.fooView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
    self.fooView.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:self.fooView];

    [UIView animateWithDuration:2 animations:^{
        self.fooView.backgroundColor = [UIColor blueColor];
    }];
}

将黄色背景设为蓝色。 fooView只是:

@property (strong, nonatomic) UIView *fooView;

但是,如果定义了自定义视图类FooView,我通过将UIView替换为FooView来更改上述代码,并为{定义空-drawRect {1}},然后就没有动画 - 背景只是立即变为蓝色。

使用FooView[UIView animateWithDuration: ...]时没有任何区别 - 它不是动画。

如果在[FooView animateWithDuration: ...]内,我打电话给-drawRect,那就是同样的事情:没有动画。

如果我将[super drawRect:rect];更改为drawRect,或者我删除了整个方法,那么动画就可以使用。

(并且可能需要drawRect2,例如,如果我们需要在自定义视图FooView中绘制圆圈怎么办?)

为什么?除了提供一个解决方案,即使使用-drawRect如何使其工作,请解释发生了什么使它不具有动画效果?

4 个答案:

答案 0 :(得分:2)

drawRect的存在:改变了UIView的运作方式。你应该只使用drawRect:当绝对必要时你永远不应该有一个空的drawRect:implementation。

如果你的子类中存在-drawRect:方法,那么UIView必须先做很多事情才能调用这个方法。也就是说,它必须分配一个可能会出现自定义绘图的潜在昂贵的后备存储,并且必须使用背景颜色填充此后备存储。

然后,在将支持商店交给GPU之前,UIView将调用您的drawRect:实现来对后备存储执行任何自定义绘制。只有这样,动画块才会开始运行。

因此,在动画开始时,代表您的自定义UIView的后备存储已经被绘制为新的背景颜色。

如果你的UIView子类没有drawRect:方法,那么视图没有后备存储。背景颜色由GPU直接处理,可以非常有效地为颜色之间的过渡设置动画。

空的UIView对象(没有drawRect:实现)相当轻量级。您的自定义视图应由多个子视图组成,具体取决于您希望实现的动画效果。

例如,UITableViewCell类由许多子视图组成。 UITableViewCell本身就是一个UIView。它包含背景视图和选定的背景视图。最重要的是内容视图,内容视图内部是各种文本标签和图像视图。所有这些视图组合在一起产生选择并调整您在常规UITableView中看到的动画。

答案 1 :(得分:1)

使用'CATransition'类。你必须做动画。 使用这种方法

+(CAAnimation *)setAnimation {}

答案 2 :(得分:1)

在动画块中使用以下行

[self.view addSubview:self.fooView];

答案 3 :(得分:0)

我们必须创建一个新类并使用CATransition并使用此类方法' +(CAAnimation *)setAnimation'。我们必须为此创建一个对象,并在转换发生时调用