28

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

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

为了创建这个效果,你必须有一个 UIViewController 来执行转换。如果我将此 UIViewController 的视图设置为屏幕上某个不占用整个屏幕的小子视图,我可以让该子视图剥离。那太棒了!但是,在过渡的第二部分之后(当页面回到原位时),视图永远不会从它们开始的地方开始。要么被剥离的视图会从原来的位置移动,要么被显示的视图会扩大到占据整个屏幕。

我犯了什么明显的错误吗?我真的很感激任何帮助!

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

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];
4

8 回答 8

10

文档

UIModalTransitionStylePartialCurl

当视图控制器出现时,当前视图的一个角会卷起以显示下面的模态视图。在关闭时,卷曲的页面会在模态视图的顶部展开。使用此转换呈现的模态视图本身会被阻止呈现任何其他模态视图。

仅当父视图控制器呈现全屏视图并且您使用 UIModalPresentationFullScreen 模态演示样式时,才支持此转换样式。尝试为父视图使用不同的外形尺寸或不同的演示风格会触发异常。

虽然,使用全屏以外的其他演示文稿,我没有任何例外。我正在测试,我遇到了和你一样的问题。我发现如果我的 ParentViewController 的视图是 ImageView 并且我将内容模式设置为 UIViewContentModeCenter,则视图不会调整大小或移动。也许有一种解决方法,将您当前的视图保存为图像,将其放在顶部,进行卷曲,然后在您关闭模式后,重新排列混乱的隐藏内容并删除顶部图像视图。我知道这听起来很疯狂,但如果我真的必须完成这个要求,我会尝试这样做。

希望这会有所帮助,豪尔赫。

于 2010-10-04T01:15:45.070 回答
7

正如 cprcrack 指出的那样,这并不能回答原始问题。但是,它是有用的信息,所以考虑到这一点,我将把它留在这里。

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

我们将调用视图控制器MapViewControllerSettingsViewController. 您的问题是您想剥离部分(并且仅部分)MapViewControllerto show SettingsViewController

这是你如何做到的:

  • 对两个视图都使用全尺寸视图。
  • 仅将内容放在's 视图的下半部分。SettingsViewController
  • 使用UIModalTransitionStylePartialCurl它们之间的过渡,就像你已经是。

iOS 会自动检测到您已完成此操作,并且只会将MapViewController' 的视图剥离到足够远的 ' 视图的下半部分SettingsViewController,这是您所有内容所在的位置。

如果您将内容放在 's 视图的上半部分SettingsViewController,iOS 会检测到它并MapViewController一直剥离 s 视图。

摘要:仅将内容放在新视图的下半部分。iOS 会解决的。

(我认为这在任何地方都没有记录,抱歉。)

于 2011-08-31T21:24:45.220 回答
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:YEScache:NO可以修复。

于 2010-10-27T18:55:49.513 回答
5

我有轻微的打嗝困惑

.modalTransitionStyle

.modalPresentationStyle

第一个在 TARGET viewController 上,例如,你想要在下面的那个。第二个在父视图控制器上,例如实际上被卷曲扭曲的那个。OP 做对了,但我做错了,在我弄明白之前的 10 分钟令人沮丧。把它扔在这个帖子上,以防它给别人我需要的头一巴掌。

于 2011-06-26T18:05:17.403 回答
0

I ran into this problem as well. For me the frame of the parent view wasn't mangled until the modal view was dismissed. So I cached the frame before dismissing then restored it right after.

CGRect frame = controllerWithModal.view.frame;
[controllerWithModal dismissModalViewControllerAnimated:YES];   
controllerWithModal.view.frame = frame;
于 2010-10-21T23:06:51.273 回答
0

我也有这个问题,但我解决了它..(不知道它的正确方法,但它的工作)

我想在滚动视图中有一个图像视图,当用户点击该滚动视图内的一个按钮时,我想卷起滚动视图并在该位置显示一个表格视图。所以我在滚动视图后面放置了一个表格视图,并最初将其设置为隐藏。当用户点击按钮时,我做了

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES];
[UIView commitAnimations];

之后从视图中删除了前视图。希望有帮助..

于 2010-10-25T10:14:19.553 回答
0

用这样的东西覆盖viewWillDisappear你的方法:underMapViewController

- (void)viewWillDisappear:(BOOL)animated
{
    curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f);

    [super viewWillDisappear:animated];
}

这会将视图的大小更正为curlableMapViewController您指定的已知大小,viewWillAppear例如,您可以在方法的早期保存它。

于 2012-10-04T23:16:01.073 回答
0

我相信 Apple 的地图应用程序使用了未记录的转换:mapCurl 和 mapUncurl。我不确定有什么方法可以完全满足 caecus314 的要求(这也是我一直试图复制的效果)。

UIModalTransitionStylePartialCurl 将卷起第一个视图的整个底部,包括工具栏,这Apple 的 Maps 应用程序不同,后者只会卷起地图并将工具栏留在原处。

据我所知,没有办法只卷曲地图。

于 2012-07-13T22:44:50.717 回答