UIView transitionFromView:toView:不是动画

时间:2012-03-27 18:46:58

标签: objective-c animation uiview uiviewanimationtransition

我正在尝试为多个中的一个特定子视图设置转换动画。最初,当我尝试执行transitionFromView:toView:时,它会动画整个superView,这不是我想要的。我只希望特定的子视图动画。所以我搜索并找到了这个:Transition behavior using transitionFromView and transitionWithView,它建议创建一个容器视图来执行动画。好的,很简单,所以我提出了这个代码:

UIView *container = [[UIView alloc] init];
container.frame = selected.frame;
selected.frame = container.bounds;
[selected.superview addSubview:container];
[container addSubview:selected];
[UIView transitionFromView:selected toView:normal duration:.2f options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL fin){
    normal.frame = container.frame;
    [container.superview addSubview:normal];
    [container removeFromSuperview];
}];

但现在我根本没有动画。我可能错过了一些简单但我找不到的东西。有什么想法吗?

更新

初始化所有值。如果我在此代码块运行之前中断,请通过调试器控制台将其拉出来:

(gdb) po normal
<SLabel: 0x9c43150; frame = (0 0; 40 40); text = '28'; tag = 28; layer = <CALayer: 0x9c43190>>
(gdb) po selected
<SLabel: 0x9ca5f00; frame = (137 148; 45 37); text = '28'; tag = 28; layer = <CALayer: 0x9c596b0>>
(gdb) po [normal superview]
Can't print the description of a NIL object.
(gdb) po [selected superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>

代码通过第5行(在转换方法之前)后,我得到:

(gdb) po container
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>
(gdb) po [container superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>
(gdb) po [selected superview]
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>

所以一切似乎都是正确的。容器放置在所选视图的位置(这是我想要翻转的视图)。容器已添加到所选视图的超级视图中。选定的视图放在容器内。最后运行转换(之后进行清理)。但我仍然没有动画......转换立即发生。

请注意,视图之间的转换正确进行。我根本就没有动画。

另一个问题:为了执行动画,转换视图是否必须是UINavigationController视图的子视图,无论距离多远?我从来没有见过像我这样的任何要求,但是这是我代码中的一个非标准方面。如果您按照每个视图的超视图进行操作,则在它到达窗口之前,没有一个将成为导航控制器的一部分。有时Apple的框架以意想不到的方式相互依赖......我想知道这是否是其中之一。

最后的答案是我的所有代码都是正确的。发生的事情是layoutSubviews在我开始动画之后被调用,在动画甚至有机会开始之前重新布置我的所有子视图。我不太清楚为什么叫它。我没有从我的代码中调用它,所以由于某种原因,我的移动视图触发了UIView来调用它我猜。无论如何,我将我的代码从layoutSubviews移到私有方法中,并且只在视图大小发生变化时调用它。现在一切都有效。 :)

1 个答案:

答案 0 :(得分:0)

你放在那里的代码没有错误,我唯一能想到的是你在其他地方遇到了一些问题。您确定您的容器视图将显示在您显示的视图中吗?

你用什么方法叫它?

因为要做动画你需要做的事情如下所示(从你在这里发布的代码你就是这样做):

UIView* normalView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[normalView setBackgroundColor:[UIColor redColor]];
UIView* selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[selectedView setBackgroundColor:[UIColor blueColor]];

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[container setBackgroundColor:[UIColor grayColor]];

[container addSubview:selectedView];
[self.view addSubview:container];

然后调用方法进行翻转。

[UIView transitionFromView:selectedView toView:normalView duration:2.0 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL fin){}];