Iphone SDK - 动画子视图
我有一个视图,它有一个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];
}
如果我理解你的解释,那么前一天我有一个非常类似的问题。
发生在第一次加载的是viewDidLoad首先触发。加载nib文件比viewWillAppear需要更多的时间来激发自身。
我们得到的是在viewWillApper已经退役后的一个笔尖加载。
之后的任何负载,viewDidLoad不会触发,让viewWillAppear做其忠诚的翻转工作。
怎么办?
首先,尝试更改您的代码以使用“viewDidAppear”。这应该有所帮助,但你必须看看它看起来不错。
另一个选项(我知道的丑陋的一个)是在viewDidLoad上也调用了checkOptionsVisible。
如果没有这种帮助,我会认为计时器是一种黑客 - 如果需求允许的话。
我希望让你更接近解决问题。
嗯,我不认为viewWillAppear消息是第一次发送。我在SDK中读到两件事。你应该调用该消息里面超级有可能适用于你的第一次大的警告:
警告:如果属于视图控制器的观点是直接加入到一个视图层次结构,视图控制器不会收到此消息。如果向视图层次结构中插入或添加视图,并且它具有视图控制器,则应直接将关联的视图控制器发送此消息。无法发送视图控制器此消息将阻止显示任何关联的动画。
最终,我会运行调试器,并确保viewWillAppear消息发送时,你认为它是。
非常有趣......我一定错过了那个笔记。让我玩弄一下,让你知道故事是什么,因为我相信它被调用。 – Dutchie432 2009-05-29 17:33:46
这是第一次射击,好吧 - 以及随后的所有时间。 – Dutchie432 2009-05-29 18:29:07
无赖,我希望这会有所帮助 – 2009-05-29 19:32:37
更新您的具体情况:
而是有四个观点:
衬背视图
主视图
后视图(选项面板)100个像素
前视图(空白视图)100像素
正常地将主视图添加到后备视图。
将前视图添加到希望显示选项窗格的支持视图中。
确保正面和背面视图具有相同的框架。
使用方法翻转正面和背面视图使用相同的代码。
原来的答案
您需要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];
}
不同的是,我有两个视图同时显示,一个大约100像素高,另一个高于另一个 - 我不在它们之间切换 - 我只是顶部以翻转的方式观看“出现”。 – Dutchie432 2009-06-03 15:47:49
UIViewController上的视图属性是懒惰加载的 - 即使当您在这里初始化一个笔尖时,视图本身也不会实例化,直到第一次访问该属性。
很难确切地知道发生了什么,但没有看到更多代码,但是如果您访问viewDidLoad中的optionsPane.view,则可能会得到所需的结果(您无需对其执行任何操作,只需访问该属性即可强制加载)。
编者注。请不要更改OP发布的问题的实际文本,除非对问题至关重要。通过编辑我的文本,你实际上改变了这个问题。保留你的标签,回滚语言。 – Dutchie432 2012-10-22 10:52:12