在Apple的iPhone正式地图应用程序中,右下角有一个小的“页面卷曲”按钮。按下它时,地图本身会向后剥离以显示一些选项。我想在我自己的应用程序中复制这个效果。
我正在尝试使用UIModalTransitionStylePartialCurl(在SDK 3.2中添加)。就其布局而言,我的应用程序几乎完全类似于Apple的官方地图应用程序。我可以轻松地将整个屏幕剥离,露出下面的另一个视图,但我不想要这个。我只想让地图视图剥离。
为了创建此效果,您必须具有将执行转换的UIViewController。如果我将这个UIViewController的视图设置为屏幕上某个不占用整个屏幕的小子视图,我可以将该子视图剥离。那很棒!但是,在转换的第二部分(当页面重新放回原位)之后,视图永远不会从它们开始的位置开始。剥离的视图将从原始位置移开,或者显示的视图将扩展为占据整个屏幕。
我有没有明显的错误?我真的很感激任何帮助!
我正在使用的代码非常简单。它基本上只是:
underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[curlableMapViewController presentModalViewController:underMapViewController animated:YES];
答案 0 :(得分:9)
UIModalTransitionStylePartialCurl
当显示视图控制器时,当前视图的一个角向上卷曲以显示下面的模态视图。在解雇时,蜷缩的页面会在模态视图之上展开。使用此转换呈现的模态视图本身无法呈现任何其他模态视图。
仅当父视图控制器呈现全屏视图并且您使用UIModalPresentationFullScreen模式演示样式时,才支持此过渡样式。尝试为父视图或不同的表示样式使用不同的形状因子会触发异常。
虽然,我没有使用其他演示文稿而不是全屏。我正在测试,我遇到了和你一样的问题。我发现如果我的ParentViewController的视图是ImageView,并且我将内容模式设置为UIViewContentModeCenter,则视图不会调整大小或移动。也许有一种解决方法是将当前视图保存为图像,将其置于顶部,进行卷曲,然后在关闭模式后,重新排列混乱的隐藏内容并删除顶部图像视图。我知道这听起来很疯狂,但如果我真的必须完成这个要求,那就是我会尝试的。
希望这会有所帮助,Jorge。
答案 1 :(得分:7)
这样的事情怎么样:
[UIView beginAnimations:@"PartialPageCurlEffect" context:nil];
[UIView setAnimationDuration:0.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myOldSubViewController.view cache:YES];
[myOldSubViewController.view addSubview:myNewViewController.view];
[UIView commitAnimations];
注意:对于某些视图,如果视图复杂且偏离中心,则可能存在工件。将cache:YES
更改为cache:NO
可能会解决问题。
答案 2 :(得分:7)
正如cprcrack指出的那样,这并没有回答原来的问题。但是,它是有用的信息,所以考虑到这一点,我将把它留在这里。
这实际上比你想象的要简单得多。
我们会调用视图控制器MapViewController
和SettingsViewController
。您的问题是要剥离MapViewController
的部分(并且仅部分)以显示SettingsViewController
。
这是你如何做到的:
SettingsViewController
视图的底部一半上。UIModalTransitionStylePartialCurl
在它们之间进行转换,就像您现在一样。 iOS会检测到您已自动完成此操作,并且仅将MapViewController
的视图移回到SettingsViewController
视图的下半部分,这是您所有内容的所在位置。< / p>
如果您将内容放在SettingsViewController
视图的上半部分,iOS会检测到该内容并将MapViewController
的视图全部剥离。
摘要:仅将内容放在新视图的下半部分。 iOS会解决这个问题。
(我不认为这在任何地方都有记录,抱歉。)
答案 3 :(得分:5)
我有一个轻微的打嗝混淆
.modalTransitionStyle
和
.modalPresentationStyle
第一个是TARGET viewController,例如你想要的那个。第二个是PARENT viewController,例如实际上被卷曲扭曲的那个。 OP得到了这个权利,但我弄错了,在我弄明白之前的10分钟令人沮丧。把它扔在这个帖子上,以防它给别人一个我需要的头sla。
答案 4 :(得分:0)
我也遇到了这个问题。对我来说,在取消模态视图之前,父视图的框架没有被破坏。所以我在解雇之前缓存了框架然后立即恢复它。
CGRect frame = controllerWithModal.view.frame;
[controllerWithModal dismissModalViewControllerAnimated:YES];
controllerWithModal.view.frame = frame;
答案 5 :(得分:0)
我也有这个问题,但我解决了..(不知道它的正确方法,但它的工作)
我希望在滚动视图中有一个imageview,当用户点击滚动视图中的按钮时,我想要卷曲滚动视图并在该位置显示一个tableview。 所以我在scrollview后面放了一个tableview,并在用户点击按钮时初始化它 我做了
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES];
[UIView commitAnimations];
之后从视图中删除了前视图。 希望有所帮助..
答案 6 :(得分:0)
我相信Apple的Maps应用程序使用了未记录的转换:mapCurl和mapUncurl。我不确定是否有任何方法可以完全按照caecus314的要求(这也是我试图复制的效果)。
UIModalTransitionStylePartialCurl将卷曲第一个视图的整个底部,包括工具栏,与 Apple的地图应用程序不同,后者只会卷曲地图并离开工具栏到位。
据我所知,没有办法只卷曲地图。
答案 7 :(得分:0)
使用以下内容覆盖viewWillDisappear
underMapViewController
方法:
- (void)viewWillDisappear:(BOOL)animated
{
curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f);
[super viewWillDisappear:animated];
}
这会将curlableMapViewController
视图的大小更正为您指定的已知大小,例如,您可以在viewWillAppear
方法中保存这些大小。