2009-05-29 89 views
3

我有一个视图,它有一个UIWebView和一个OptionsPane(具有自定义视图的自定义UIViewController)。Iphone SDK - 动画子视图

我希望当显示视图时,对于选项窗格(位于主视图的顶部)将FLIP放置到位。我正在使用该代码,并且得到了一个奇怪的结果。

第一次显示视图时,选项窗格似乎已经可见...当我在我的navController上按BACK时,再次拉起视图,动画完美地工作。

任何人都可以对这个主题有所了解吗?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    optionsPane=[[OptionsPaneController alloc] initWithNibName:@"OptionsPane" bundle:nil]; 
} 

- (void)viewWillAppear:(BOOL)animated { 

    [optionsPane.view removeFromSuperview]; 
    [self checkOptionsVisible]; 
} 

-(void)checkOptionsVisible{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[optionsPane view] cache:YES]; 
    [[self view] addSubview:[optionsPane view]]; 
    [theWebView setFrame:CGRectMake(0,87,320,230)]; 
    [[optionsPane view] setFrame:CGRectMake(0,0,320,87)]; 
    [UIView commitAnimations];  
} 
+0

编者注。请不要更改OP发布的问题的实际文本,除非对问题至关重要。通过编辑我的文本,你实际上改变了这个问题。保留你的标签,回滚语言。 – Dutchie432 2012-10-22 10:52:12

回答

0

如果我理解你的解释,那么前一天我有一个非常类似的问题。

发生在第一次加载的是viewDidLoad首先触发。加载nib文件比viewWillAppear需要更多的时间来激发自身。

我们得到的是在viewWillApper已经退役后的一个笔尖加载。

之后的任何负载,viewDidLoad不会触发,让viewWillAppear做其忠诚的翻转工作。

怎么办?
首先,尝试更改您的代码以使用“viewDidAppear”。这应该有所帮助,但你必须看看它看起来不错。

另一个选项(我知道的丑陋的一个)是在viewDidLoad上也调用了checkOptionsVisible。
如果没有这种帮助,我会认为计时器是一种黑客 - 如果需求允许的话。

我希望让你更接近解决问题。

1

嗯,我不认为viewWillAppear消息是第一次发送。我在SDK中读到两件事。你应该调用该消息里面超级有可能适用于你的第一次大的警告:

警告:如果属于视图控制器的观点是直接加入到一个视图层次结构,视图控制器不会收到此消息。如果向视图层次结构中插入或添加视图,并且它具有视图控制器,则应直接将关联的视图控制器发送此消息。无法发送视图控制器此消息将阻止显示任何关联的动画。

最终,我会运行调试器,并确保viewWillAppear消息发送时,你认为它是。

+0

非常有趣......我一定错过了那个笔记。让我玩弄一下,让你知道故事是什么,因为我相信它被调用。 – Dutchie432 2009-05-29 17:33:46

+0

这是第一次射击,好吧 - 以及随后的所有时间。 – Dutchie432 2009-05-29 18:29:07

+0

无赖,我希望这会有所帮助 – 2009-05-29 19:32:37

0

更新您的具体情况:

而是有四个观点:

  1. 衬背视图

  2. 主视图

  3. 后视图(选项面板)100个像素

  4. 前视图(空白视图)100像素

正常地将主视图添加到后备视图。

将前视图添加到希望显示选项窗格的支持视图中。

确保正面和背面视图具有相同的框架。

使用方法翻转正面和背面视图使用相同的代码。


原来的答案

您需要3次:

  1. 衬背视图

  2. 前视图

  3. 后视图

支持视图只是保持其他2来回翻转下面是翻转方法。我把它们放在backingViewController中:

- (void)displayBack{ 

    //parent controller is an ivar so the sub-view controllers know who their daddy is 
    backController.parentController = self; 


    [UIView beginAnimations:nil context:@"flipTransitionToBack"]; 
    [UIView setAnimationDuration:1.2]; 

    //note self.view IS the backing view 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 

    //remove the front view 
    [[frontController view] removeFromSuperview]; 
    //add the back view view 
    [self.view addSubview:[backController view]]; 
    [UIView commitAnimations]; 

    //giving a heads up to the view that is about to come on screen 
    [backController viewWillAppear:YES]; 

} 



- (void)displayFront{ 

    [UIView beginAnimations:nil context:@"flipTransitionToFront"]; 
    [UIView setAnimationDuration:1.2]; 

    [UIView setAnimationDelegate:self]; 

    //I'm interested in knowing this has happened 
    [UIView setAnimationDidStopSelector:@selector(flipAnimationDidEndWithID:finished:context:)]; 

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; 
    //remove back view 
    [[backController view] removeFromSuperview]; 
    //add the front view 
    [self.view addSubview:[frontController view]]; 
    [UIView commitAnimations]; 

} 
+0

不同的是,我有两个视图同时显示,一个大约100像素高,另一个高于另一个 - 我不在它们之间切换 - 我只是顶部以翻转的方式观看“出现”。 – Dutchie432 2009-06-03 15:47:49

0

UIViewController上的视图属性是懒惰加载的 - 即使当您在这里初始化一个笔尖时,视图本身也不会实例化,直到第一次访问该属性。

很难确切地知道发生了什么,但没有看到更多代码,但是如果您访问viewDidLoad中的optionsPane.view,则可能会得到所需的结果(您无需对其执行任何操作,只需访问该属性即可强制加载)。