【问题标题】:How can I use UIModalTransitionStylePartialCurl on a UIView that does NOT take up the whole screen?如何在不占用整个屏幕的 UIView 上使用 UIModalTransitionStylePartialCurl?
【发布时间】:2011-04-20 14:19:29
【问题描述】:

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

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

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

我犯了什么明显的错误吗?非常感谢任何帮助!

我使用的代码非常简单。基本上就是这样:

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];

【问题讨论】:

  • 真的吗?现有答案都没有解决您的问题吗? 【咳咳咳】你可能要至少接受其中1个,它真的可以帮助人们有动力帮助你!

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


【解决方案1】:

来自Documentation

UIModalTransitionStylePartialCurl

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

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

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

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

【讨论】:

  • 谢谢!我会用你建议的技术鬼混,看看我能不能想出一些有用的东西。
【解决方案2】:

这样的事情怎么样:

    [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 可能会修复。

【讨论】:

  • 这是一个类似的效果,但不是 OP 想要的。这段代码会导致“旧”视图完全“撕掉”,而不是仅仅“剥开”一点点露出下面的东西(比如地图)。
  • 再读一遍我就明白他的意思了。也许有人可以以某种方式中途中止动画以使其部分显示?
【解决方案3】:

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

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

我们将调用视图控制器MapViewControllerSettingsViewController。您的问题是您想剥离MapViewController部分(并且仅部分)以显示SettingsViewController

你是这样做的:

  • 对两个视图都使用全尺寸视图。
  • 仅将 content 放在 SettingsViewController 视图的 底部 一半。
  • 使用UIModalTransitionStylePartialCurl 在它们之间进行转换,就像你已经做到的那样。

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

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

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

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

【讨论】:

  • 虽然您的回答可能有用,但您所描述的只是UIModalTransitionStylePartialCurl 的正常行为。 @caecus318 面临的问题必须是由于在视图底部保留一个没有任何动画的栏并返回到原始状态。
  • 啊哈,在你解释之前,这个问题对我来说从来没有真正的意义。我已经修改了我的答案。 (它很有用,所以我不想只是删除它。)
【解决方案4】:

我有点打嗝的困惑

.modalTransitionStyle

.modalPresentationStyle

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

【讨论】:

    【解决方案5】:

    我也遇到了这个问题。对我来说,父视图的框架直到模态视图被解除才被破坏。所以我在关闭之前缓存了帧,然后立即恢复它。

    CGRect frame = controllerWithModal.view.frame;
    [controllerWithModal dismissModalViewControllerAnimated:YES];   
    controllerWithModal.view.frame = frame;
    

    【讨论】:

      【解决方案6】:

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

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

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

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

      【讨论】:

        【解决方案7】:

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

        UIModalTransitionStylePartialCurl 会卷起第一个视图的整个底部,包括工具栏,这不像苹果的地图应用,它只会卷起地图并离开工具栏就位。

        据我所知,没有办法只把地图卷起来。

        【讨论】:

        • 当然有办法,实际上提问的用户是在告诉你完成它的过程。你至少读过这个问题吗?它说的部分:“我可以让那个子视图剥离。太棒了!”不得不处理甚至没有仔细阅读问题的人的不真实答案真的很烦人。对不起,我不得不说。
        【解决方案8】:

        用类似这样的东西覆盖 underMapViewControllerviewWillDisappear 方法:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多