在新的单一视图应用程序中,以下代码:
- (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
如何使其工作,请解释发生了什么使它不具有动画效果?
答案 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'。我们必须为此创建一个对象,并在转换发生时调用