如何使用 iOS 7 自定义转换在顶部呈现半模态视图控制器

Posted

技术标签:

【中文标题】如何使用 iOS 7 自定义转换在顶部呈现半模态视图控制器【英文标题】:How to present a half modal view controller over the top with iOS 7 custom transitions 【发布时间】:2014-04-05 00:34:44 【问题描述】:

我将如何在主视图控制器的顶部显示一个“半视图”控制器?

要求: - 呈现第二个视图控制器,它滑过主视图控制器的顶部。 - 第二个视图控制器应该只显示主视图控制器的一半以上 - 主视图控制器应该在第二个视图控制器后面保持可见(透明背景,下面不显示黑色) - 第二个视图控制器应该使用类似于模态垂直覆盖或 ios 7 自定义过渡的动画进行动画处理 - 当第二个视图控制器处于活动状态时,用户仍然可以与主视图控制器上的按钮进行交互(即第二个视图控制器不覆盖整个主视图控制器)r - 第二个视图控制器有自己复杂的逻辑(不能是简单的视图) - 故事板、Segues、仅限 iOS 7 - 仅限 iPhone,不支持 iPad。

我尝试过使用模态视图控制器,但这不允许与主视图控制器进行交互。有人可以提供一个如何使用 iOS7 自定义转换或其他方法执行此操作的示例。

【问题讨论】:

看看 UIActionSheet ,它可能会解决你的问题。这是您可以开始使用的链接:eureka.ykyuen.info/2010/04/14/iphone-uiactionsheet-example 【参考方案1】:

一种方法是将“半模态”控制器添加为子视图控制器,并为其视图设置动画。对于此示例,我在情节提要中创建了“半模态”控制器,其框架高度为 4 英寸 iPhone 屏幕的一半。您可以使用更多动态方法来考虑不同的屏幕尺寸,但这应该可以帮助您入门。

@interface ViewController ()
@property (strong,nonatomic) UIViewController *modal;
@end

@implementation ViewController


- (IBAction)toggleHalfModal:(UIButton *)sender 
    if (self.childViewControllers.count == 0) 
        self.modal = [self.storyboard instantiateViewControllerWithIdentifier:@"HalfModal"];
        [self addChildViewController:self.modal];
        self.modal.view.frame = CGRectMake(0, 568, 320, 284);
        [self.view addSubview:self.modal.view];
        [UIView animateWithDuration:1 animations:^
            self.modal.view.frame = CGRectMake(0, 284, 320, 284);;
         completion:^(BOOL finished) 
            [self.modal didMoveToParentViewController:self];
        ];
    else
        [UIView animateWithDuration:1 animations:^
            self.modal.view.frame = CGRectMake(0, 568, 320, 284);
         completion:^(BOOL finished) 
            [self.modal.view removeFromSuperview];
            [self.modal removeFromParentViewController];
            self.modal = nil;
        ];
    

【讨论】:

这很好用。很好的解决方案。从模态视图控制器内部中消除此模态的最佳方法是什么? (不是主视图控制器的切换) @johnsampson,您可以使用 self.parentViewController 获取指向主视图控制器的指针,并使用它来调用 toggleHalfModal。 对不起。我是一个真正的初学者。由于您的代码,我得到了模式工作。如何使用 self.parentViewController 从模态调用 toggleHalfModal? @johnsampson,就像你调用任何方法一样——[objectToSendMessageTo message];在这种情况下,您要向其发送消息的对象是 self.parentViewController(您必须对其进行强制转换,以便编译器知道它是什么,并导入它的 .h 文件)。所以这给了你 [(MainViewController *)self.parentViewController toggleHalfModal];用该控制器的类名替换 MainViewController。 @Septronic,一种方法是在新视图中制作动画之前,在原始视图上方添加一个半透明(低 alpha 值的黑色)视图。

以上是关于如何使用 iOS 7 自定义转换在顶部呈现半模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

IOS 7:添加具有透明度的模态 ViewController:自定义大小

iOS 7 在 UINavigationController 中呈现模式视图?

animateTransition 不再适用于 iOS 13 中模态呈现的 viewController

如何在不使用 presentViewController 的情况下以模态方式呈现自定义视图?

iOS:如何让 ViewController A 模态呈现 B,然后让 B 直接关闭/转换到模态呈现的 C?

自定义模态转换关闭动画运行不同步