模态(modal)一个部分透明的ViewController

前言

最近项目遇到一个需求:从一个viewController A模态出一个新的viewController B, 要求B占领屏幕的下半部分,上半部分透明.如下图:

模态(modal)一个部分透明的ViewController_第1张图片
要达到的效果

思路是将B控制器的背景颜色设置为透明色(注意,不是设置alpha = 0, 而是self.view.backgroundColor = [UIColor clearColor];),但是发现这样的话,屏幕的上半部分会变黑,如下图:

模态(modal)一个部分透明的ViewController_第2张图片
坑爹的效果

本文记录了实现该效果的方法.

干货

经过google, 最终发现是因为modal时,需要设置弹出的控制器(B)的属性.

- (void)modal {
    UIViewController *B = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]instantiateViewControllerWithIdentifier:@"ViewControllerTow"];
    B.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    B.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentViewController:B animated:YES completion:nil];
}

另外

有一篇文章中写道, 以上设置是ios8之后才能用到的代码,ios8之前是设置A控制器的,即谁弹出控制器,谁就设置以下属性:

- (void)modal {
    UIViewController *two = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]instantiateViewControllerWithIdentifier:@"ViewControllerTow"];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:two animated:YES completion:nil];
}

综上

- (void)modal {
    UIViewController *two = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]instantiateViewControllerWithIdentifier:@"ViewControllerTow"];
    float version = [UIDevice currentDevice].systemVersion.floatValue;
    if (version < 8.0) {
        self.modalPresentationStyle = UIModalPresentationCurrentContext;
    } else {
    [self presentViewController:two animated:YES completion:nil];
    }
}

由于手头没有8.0以下版本的设备,所以希望有条件的童鞋帮忙测试一下,并反馈给我,谢谢大家.

你可能感兴趣的:(模态(modal)一个部分透明的ViewController)