在iOS上,自定义视图无法进行动画?

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`,并将上述代码中的`UIView`替换为`FooView`,还为`FooView`定义了一个空的`-drawRect`,那么就不会有动画效果--背景色只会立即变为蓝色。
使用`[UIView animateWithDuration:...]`或者`[FooView animateWithDuration:...]`没有任何区别--依然没有动画效果。
如果在`-drawRect`中调用`[super drawRect:rect];`,那么也一样:没有动画效果。
如果将`drawRect`改为`drawRect2`,或者移除整个方法,则动画效果会正常工作。
(而`-drawRect`可能是必需的,例如,假设我们需要在自定义视图`FooView`中绘制一个圆形?)
为什么会这样?除了提供如何使其即使带有`-drawRect`也能正常工作的解决方案外,请解释一下发生了什么导致它没有动画效果?

1
请查看以下链接:http://stackoverflow.com/questions/1614630/animate-the-change-of-a-stroke-color-on-uiview - Romit M.
4个回答

2
具有drawRect:的存在会改变UIView的操作方式。只有在绝对必要时才应使用drawRect:,并且您不应该有一个空的drawRect:实现。
如果您的子类中存在-drawRect:方法,则UIView必须在调用此方法之前执行许多操作。即,它必须分配一个潜在昂贵的后备存储器,其中您的自定义绘图将发生,并且它必须使用背景颜色填充此后备存储器。
然后,UIView将调用您的drawRect:实现,在将后备存储器交给GPU之前,在其上进行任何自定义绘制。仅在所有这些操作完成之后,您的动画块才开始运行。
因此,在动画开始时,代表您自定义UIView的后备存储器已经被涂上了新的背景颜色。
如果您的UIView子类没有drawRect:方法,则视图没有后备存储器。背景颜色由GPU直接处理,可以非常有效地在颜色之间进行动画过渡。
空的UIView对象(没有drawRect:实现)相当轻巧。根据您想要实现的动画效果,您的自定义视图应由多个子视图组成。
例如,UITableViewCell类由许多子视图组成。 UITableViewCell本身是一个UIView。它包含一个背景视图和一个选定的背景视图。在其上是内容视图,在内容视图内部有各种文本标签和图像视图。所有这些视图组合在一起,产生您在常规UITableView中看到的选择和调整大小动画。

1
使用 'CATransition' 类,您将需要进行动画处理。使用以下方法:
+(CAAnimation *)setAnimation{}

0

在动画块中使用以下代码行

[self.view addSubview:self.fooView];


0

我们需要创建一个新的类,使用CATransition并使用这个类的方法' +(CAAnimation *)setAnimation',而不是像这样。我们需要为此创建一个对象,并在转换发生时调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接