IPhone UIToolBar UiBarButtonItem过渡问题

时间:2009-07-19 08:03:33

标签: iphone button transition uitoolbar

我有一个带有UIToolBar的UIView,当我从UiView开始转换(UIViewAnimationTransitionFlipFromLeft)到此视图时,按钮“返回”按钮仅在转换结束时出现 为什么?请帮帮我

由于

代码:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.90];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    UIViewController *coming = nil;
UIViewController *going = nil;
    UIViewAnimationTransition transition;
going = languageMenu;
coming = loadingmenu;
transition = UIViewAnimationTransitionFlipFromLeft;
   [UIView setAnimationTransition: transition forView:self.view cache:YES];

[coming viewWillAppear:YES];
[going viewWillDisappear:YES];

[going.view removeFromSuperview];
[self.view insertSubview: coming.view atIndex:0];
[going viewDidDisappear:YES];
[coming viewDidAppear:YES];

[UIView commitAnimations];

3 个答案:

答案 0 :(得分:1)

我想说这取决于你何时创建UIToolbar及其后退按钮,以及何时将它们添加到新视图中。

此外 - 为什么viewWillAppear和viewWillDisappear行需要成为动画的一部分?我试着将它们从动画中拉出来,并将viewDidDisappear和viewDidAppear移动到动画完成时调用的回调函数中;请参阅UIView setAnimationDidStopSelector的文档。

不确定这是否有帮助,但可能会有所帮助。

答案 1 :(得分:0)

缓存转换的工作方式是iPhone获取窗口的快照,并对其进行一些转换,就好像它是一个图像一样。未缓存的转换实际上会在转换时重绘实时窗口。

您的问题似乎是拍摄快照时视图中不存在后退按钮。解决方案可能是手动添加按钮而不是依赖导航视图控制器等。

答案 2 :(得分:0)

这可能是两个视图之间存在差异的问题。在IB中查看您的观点属性;你为两者指定了状态栏吗?或者只是其中之一?这可能会导致垂直偏移的差异,并且可能会导致一些问题。

您可以通过在动画转换代码之前将两个帧设置为相等来解决这个小问题:

newViewController.view.frame = self.view.frame;

(这也应该允许你恢复到缓存:是)

另一方面,您可能需要考虑子视图添加到当前窗口而不是当前窗口的当前视图,因此:

[[self.view superview] addSubview:newViewController.view];

这样您就可以删除对所有窗口事件的显式调用。您还需要将转换链接到窗口而不是当前视图,否则动画将无效:

[UIView setAnimationTransition:transition forView:self.view.superview cache:YES];

我正在努力解决类似的问题,并最终做到了这一点。您可能还想尝试使用QuartzCore基础动画:

#import <QuartzCore/QuartzCore.h>

// ...

    // get the view that's currently showing
    UIView *currentView = self.view;
    [currentView retain];
    // get the the underlying UIWindow, or the view containing the current view
    UIView *theWindow = [currentView superview];

    UIView *newView = myNewViewController.view;
    newView.frame = currentView.frame;

    // add subview
    [theWindow addSubview:newView];

    // set up an animation for the transition between the views
    CATransition *animation = [CATransition animation];
    [animation setDuration:0.8];
    [animation setType:kCATransitionPush];
    [animation setSubtype:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction
            functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

    [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];

要转换回来,请执行相同的操作(当然,除了相反的方向)替换您的添加子视图:

    [self.view removeFromSuperview];

有了这个,前一个窗口将再次出现,但它的事件不会被触发(我仍然不确定为什么)。

我希望这能为你排序并帮助很多其他人。