在 iOS 9 中呈现透明模式视图

Posted

技术标签:

【中文标题】在 iOS 9 中呈现透明模式视图【英文标题】:present transparent modal view in iOS 9 【发布时间】:2016-02-08 11:14:32 【问题描述】:

有很多答案,但对于 ios 9 尤其是 9.2,似乎没有一个可以正常/完美地工作。请有人帮忙。这是一个简单的场景:

1) Storyboard segues 连接到单个 toBePresentedModally 视图控制器,我选择了 UIModalPresentationOverCurrentContext 并在 Storyboard 的样式不起作用时切换并尝试使用 UIModalPresentationCurrentContext。

2) 我要么在幸福 1 秒后得到黑色背景(它只工作一秒)要么在尝试通过分配 toBePresentedModally 视图控制器类来通过代码呈现它时得到一个空白控制器。

任何帮助将不胜感激!

【问题讨论】:

请在下方查看我的回答 【参考方案1】:

就是这样,我在我的代码中已经完成了

let viewController = UIStoryboard.loadViewController("Identifier")
viewController.providesPresentationContextTransitionStyle = true
viewController.definesPresentationContext = true
viewController.modalPresentationStyle = .OverCurrentContext
self.presentViewController(viewController)

而且运行良好。

【讨论】:

不寻找 Swift 实现!不过谢谢! 将swift转换成objective c并不难,如果你说我可以为你做到:)【参考方案2】:

这是在 iOS 9+ 中测试的正确答案:

使用故事板

选择你的 segue 并在属性检查器中:

亲切的“模态” “默认”演示和过渡

之后,选择您的模态视图控制器并在属性检查器中:

演示文稿“在当前上下文中”

希望能帮到你。

【讨论】:

【参考方案3】:

实现符合 UIViewControllerTransitioningDelegate 协议的类 'TransitionDelegate' 并给出实现

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source 
    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    controller.isPresenting = YES;
    return controller;

您的 AnimatedTransition 类应该是这样的,

#import "AnimatedTransitioning.h"
#import "MainViewController.h"
#import "SecondViewController.h"

@implementation AnimatedTransitioning

//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
    return 0.25f;


- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 

    UIView *inView = [transitionContext containerView];
    SecondViewController *toVC = (SecondViewController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    MainViewController *fromVC = (MainViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     
                     completion:^(BOOL finished) 
                         [transitionContext completeTransition:YES];
                     ];

@end

这里我在源视图控制器类(MainViewController.m)中实现按钮操作,希望您可以根据您的要求更改它,

- (IBAction)displaySecondVC:(id)sender 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    vc.modalPresentationStyle= UIModalPresentationCustom;
    [vc setTransitioningDelegate:transitionController];
    [self presentViewController:vc animated:YES completion:nil];

在同一个类的viewdidLoad中添加这个

self.transitionController = [[TransitionDelegate alloc] init];

如有任何问题请联系我。

【讨论】:

【参考方案4】:

如果你想为你的 ViewController 设置一个透明背景,试试这个!!

获取一个视图(命名为 DimmedView)并使其与 superView 的宽度和高度相等。 将 SuperView 的背景颜色设置为 ClearColor 和 DimmedView 的 LightGrayColoralpha 0.5 现在使用包含实际内容的 CenterView 并设置适当的约束。 如果您想在 CenterView 之外通过触摸关闭 Controller,请向 DimmeedView 添加点按手势

现在当你展示 viewController 时设置这个属性。

ViewController *VC = segue.destinationViewController;
VC.modalPresentationStyle = UIModalPresentationOverCurrentContext;

不要忘记在 TapGesture 事件中关闭 ViewController。

【讨论】:

【参考方案5】:
DashboardSettingsViewController *view=[self.storyboard   instantiateViewControllerWithIdentifier:@"dashboardSettings"];

view.providesPresentationContextTransitionStyle = YES;
view.definesPresentationContext = YES;
[view setModalPresentationStyle:UIModalPresentationOverCurrentContext];
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction =
[CAMediaTimingFunction   functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;


//// for a smoother navigation
UIView *containerView = self.view.window;
[containerView.layer addAnimation:transition forKey:nil];
[self.navigationController presentViewController:view animated:YES completion:nil];

// lastly the background of to be presented view controller should be set to clear with alpha of your choice!

【讨论】:

以上是关于在 iOS 9 中呈现透明模式视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS:具有透明背景的模态 ViewController

UIPrintInteractionController 半透明条问题

如何在 iOS 6 中使用 UIPopoverBackgroundView 呈现透明弹出框

iOS - 半透明模态视图控制器

场景视图控制栏

在 iOS15 上将 UIActivityViewController 共享模式导航栏更改为不透明