Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在iOS上,自定义视图赢得';你不动吗?_Iphone_Ios_Uiview_Core Animation_Uiviewanimation - Fatal编程技术网

Iphone 在iOS上,自定义视图赢得';你不动吗?

Iphone 在iOS上,自定义视图赢得';你不动吗?,iphone,ios,uiview,core-animation,uiviewanimation,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]; [UIVi

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

- (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
来更改上面的代码,并且还为
FooView
定义了一个空的
-drawRect
,那么就不会有动画了——背景立即变为蓝色

如果使用
[UIView animateWithDuration:…]
[FooView animateWithDuration:…]
,则没有区别——这不是动画

如果在
-drawRect
内,我调用
[super-drawRect:rect],则是同一件事:没有动画

如果我将
drawRect
更改为
drawRect2
,或者如果我删除了整个方法,则动画将正常工作

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


为什么呢?除了给出如何使其即使与
-drawRect
一起工作的解决方案外,请解释是什么原因使其无法进行动画制作?

使用“CATTransition”类。您必须进行动画制作。 使用这种方法


+(CAAnimation*)设置动画{}

在动画块中使用以下行


[self.view addSubview:self.fooView]

drawRect的出现:改变UIView的操作方式。您应该只在绝对必要时使用drawRect:并且您永远不应该有一个空的drawRect:实现

如果子类中存在-drawRect:方法,那么UIView在调用此方法之前必须做很多事情。也就是说,它必须分配一个可能非常昂贵的支持存储,自定义图形将出现在该支持存储中,并且必须使用背景色填充该支持存储

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

因此,在动画开始时,表示自定义UIView的后台存储已绘制为新的背景色

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

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


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

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

检查此链接[ [1]: