如何在不占用整个屏幕的UIView上使用UIModalTransitionStylePartialCurl?

时间:2010-10-03 22:52:37

标签: iphone objective-c uiview modal-dialog transition

在Apple的iPhone正式地图应用程序中,右下角有一个小的“页面卷曲”按钮。按下它时,地图本身会向后剥离以显示一些选项。我想在我自己的应用程序中复制这个效果。

我正在尝试使用UIModalTransitionStylePartialCurl(在SDK 3.2中添加)。就其布局而言,我的应用程序几乎完全类似于Apple的官方地图应用程序。我可以轻松地将整个屏幕剥离,露出下面的另一个视图,但我不想要这个。我只想让地图视图剥离。

为了创建此效果,您必须具有将执行转换的UIViewController。如果我将这个UIViewController的视图设置为屏幕上某个不占用整个屏幕的小子视图,我可以将该子视图剥离。那很棒!但是,在转换的第二部分(当页面重新放回原位)之后,视图永远不会从它们开始的位置开始。剥离的视图将从原始位置移开,或者显示的视图将扩展为占据整个屏幕。

我有没有明显的错误?我真的很感激任何帮助!

我正在使用的代码非常简单。它基本上只是:

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];

8 个答案:

答案 0 :(得分:9)

来自Documentation

  

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指出的那样,这并没有回答原来的问题。但是,它是有用的信息,所以考虑到这一点,我将把它留在这里。

这实际上比你想象的要简单得多。

我们会调用视图控制器MapViewControllerSettingsViewController。您的问题是要剥离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方法中保存这些大小。