UIView transitionFromView: toView: 动画不起作用。

6

这是我在stackoverflow上的第一篇文章。我是iOS开发新手,不是母语为英语的人,所以我会尽力解释我的问题。

问题:

我已经将两个视图添加到我的AppDelegate窗口中,并且我想使用以下方法从一个视图翻转到另一个视图:

 UIView transitionFromView:toView:

第一个视图(MainScreenView)有自己的ViewController。在MainScreenView.xib文件中,我有一个带有动作的按钮,调用在我的AppDelegate中实现的"goShow"方法。在那个方法中,我使用UIView transitionFromView:toView:来过渡到第二个视图。到目前为止,一切正常。
我的第二个视图(一个滚动视图)在我的AppDelegate中以编程方式声明,并且里面有许多图片(picturesViewController),并且在这些图片的顶部有一个UIPinchGestureRecognizer
我使用手势识别器来翻转回到我的MainScreenView。问题就在这里。当我在滚动视图上进行捏合手势时,MainScreenView.view立即出现,动画之前,因此翻转动画看起来不正确。
我正在使用的代码是:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

mainScreen = [[MainScreenViewController alloc] initWithNibName:@"MainScreenViewController" bundle: [NSBundle mainBundle]];

CGRect frame = self.window.bounds;
int pageCount = 10;
scrollView = [[UIScrollView alloc] initWithFrame:frame];
scrollView.contentSize = CGSizeMake(320*pageCount, 480);
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = FALSE;
scrollView.showsVerticalScrollIndicator = FALSE;
scrollView.delegate = self;

[...] 'While' adding pictures to de scrollView

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain)] autorelease];
[scrollView addGestureRecognizer:twoFingerPinch];

[self.window addSubview: scrollView];
[scrollView setHidden:TRUE];
[self.window addSubview: mainScreen.view];

[self.window makeKeyAndVisible];
return YES;
}

-(void) goShow{

[UIView transitionFromView:mainScreen.view
                    toView:scrollView 
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                    
                completion:NULL];

[UIView commitAnimations];    
}

-(void) goBackToMain {

[UIView transitionFromView:scrollView
                    toView:mainScreen.view 
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                     
                completion:NULL]; 

[UIView commitAnimations];
}

我使用show/hide视图代替addSubview/removeFromSuperView,因为我尝试了添加和删除并在捏合手势中崩溃,恰好在动画失败的同一步骤中。可能是相同的错误,但我无法找到原因。任何帮助将不胜感激。
谢谢。
好的。在Adrian的帮助下,这是解决我的问题的UIPinchGesture代码:
[...]

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain:)] autorelease];
[scrollView addGestureRecognizer:twoFingerPinch];


-(void)goBackToMain:(UIPinchGestureRecognizer *)recognizer {

if (recognizer.state == UIGestureRecognizerStateEnded)
{
    [UIView transitionFromView:scrollView
                        toView:mainScreen.view 
                      duration:0.4
                       options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews                     
                    completion:nil]; 

    [UIView commitAnimations];
}

1
这个解释比大多数以英语为母语的人讲得更好。+1。 - Clay Bridges
2个回答

1
首先,您不能将旧的方法beginAnimationcommitAnimation与新的块方法transitionFromView混合使用。
其次,在使用块方法动画时,请确保使用一个容器(可能是UIView),该容器将是要切换的两个视图的父级。如果没有容器,则会同时对整个视图进行动画处理。确保容器与将要切换的子视图具有相同的大小。
示例:
    [container addSubView:frontView];
    [container addSubView:backView];
[self.view addSubView:container];
[UIView transitionFromView:backView toView:frontView duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];

0

我已经阅读了苹果公司的文档,但似乎没有帮助解决我的问题。我正在为iOS4(.3)开发此应用程序,[UIView beginAnimations]已被弃用。苹果现在推荐使用块API,实际上我的“goShow”方法运行得非常完美。然而,类似的“goBackToMain”却不行。两者之间的区别在于,“goBackToMain”是由UIPinchGestureRecognizer调用的。我不确定问题是否出在手势识别器代码中,也不确定具体问题所在,但我想不出其他原因导致这个错误。 - romeup
如果您正在使用捏合手势识别器,请尝试将手势作为参数放入,这样您就可以获取手势的状态并在特定事件(UIGestureRecognizerStateBegan等)上执行代码。无论如何,如果您不使用带有动画的块,则仍应使用[UIView begnAnimations]。这是一个使用手势的示例:UIPinchGestureRecognizer twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain:)] autorelease]; 方法应该是“-(void)goBackToMain:(UIGestureRecognizer) gesture”。 - Adrian Ancuta
谢谢Adrian。那就是我所缺少的,使用手势的状态。我会发布我的最终代码,以便其他遇到同样问题的人可以尝试这个解决方案。 - romeup

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