4

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

- (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,并且我将上面的代码替换UIViewFooView,并且还定义了一个空-drawRect的 for FooView,那么将没有动画 - 背景立即变为蓝色。

使用[UIView animateWithDuration: ...]or没有区别[FooView animateWithDuration: ...]——它不是动画。

如果 inside -drawRect,我调用[super drawRect:rect];,那么它是同一件事:没有动画。

如果我更改drawRectdrawRect2,或者如果我删除了整个方法,那么动画将起作用。

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

这是为什么?除了给出如何使它工作的解决方案之外-drawRect,请解释发生了什么使它没有动画?

4

4 回答 4

2

drawRect 的存在:改变了 UIView 的操作方式。你应该只在绝对必要的时候使用 drawRect: 并且你不应该有一个空的 drawRect: 实现。

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

然后 UIView 将调用您的 drawRect: 实现以对后备存储进行任何自定义绘图,然后将后备存储交给 GPU。只有在所有这些之后,您的动画块才会开始运行。

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

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

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

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

于 2012-09-17T17:21:59.047 回答
1

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

+(CAAnimation *)setAnimation{}

于 2012-09-17T12:32:06.913 回答
1

在动画块中使用以下行

[self.view addSubview:self.fooView];

于 2012-09-17T12:45:47.600 回答
0

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

于 2012-09-19T07:34:04.293 回答