美文网首页
Semi-Modal 半模态弹出窗口

Semi-Modal 半模态弹出窗口

作者: 卜卜星 | 来源:发表于2016-05-19 10:01 被阅读524次

Semi-Modal 半模态弹出窗口

主题: 怎样实现一个modal出来的view, 上半部分透明, 下班部分有View.

最终效果图

定弹出Modal的控制器为A, 被弹出的控制器为B.点击控制器A的button弹出控制器B.
思路是在B上画好下半部分不透明的view做一个覆盖层(overlay view), 然后设置B控制器的背景颜色为透明色.

    self.view.backgroundColor = [UIColor clearColor];

但是这样的话, 弹出B后, 想要B透明的部分反而变成了黑色.

查看UIViewController源码, 发现viewController有以下属性


/*
  Defines the transition style that will be used for this view controller when it is presented modally. Set
  this property on the view controller to be presented, not the presenter.  Defaults to
  UIModalTransitionStyleCoverVertical.
*/
@property(nonatomic,assign) UIModalTransitionStyle modalTransitionStyle NS_AVAILABLE_IOS(3_0);
@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle NS_AVAILABLE_IOS(3_2);

如官方注释所说, 要把UIModalPresentationStyle和UIModalTransitionStyle属性设置给被modal弹出的控制器, 也就是控制器B.
而这两个属性有以下详细选项:

typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {
    UIModalTransitionStyleCoverVertical = 0,
    UIModalTransitionStyleFlipHorizontal __TVOS_PROHIBITED,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl NS_ENUM_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED,
};

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
        UIModalPresentationFullScreen = 0,
        UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED,
        UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED,
        UIModalPresentationCurrentContext NS_ENUM_AVAILABLE_IOS(3_2),
        UIModalPresentationCustom NS_ENUM_AVAILABLE_IOS(7_0),
        UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),
        UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0),
        UIModalPresentationPopover NS_ENUM_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED,
        UIModalPresentationNone NS_ENUM_AVAILABLE_IOS(7_0) = -1,         
};

于是在A控制器modal出B控制器之前, 设置modalPresentationStyle属性给控制器B

-(void)modal:(id)sender{
    BViewController *bVC = [[BViewController alloc]init];    
    bVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;    
    [self presentViewController: bVC animated:YES completion:nil];
}

运行发现可以得到需要的效果了.
此文由这篇文章
模态(modal)一个部分透明的ViewController启发, 但是觉得作者的代码有点小问题.

考虑到兼容性的问题, iOS8之前要把弹出modal方式的属性设置给弹Modal的控制器(A控制器), 而不是被弹出的B控制器.而且要注意具体是哪个ViewController要弹出控制器.
具体的看这里

以下是一个扩展来解决兼容性问题


#define SystemVersion [UIDevice currentDevice].systemVersion.floatValue


@implementation UIViewController (Extensions)

- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SystemVersion < 8.0) {
        self.parentViewController.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }

    [self presentViewController:viewControllerToPresent animated:YES completion:completion];
}

@end

相关文章

  • Semi-Modal 半模态弹出窗口

    Semi-Modal 半模态弹出窗口 主题: 怎样实现一个modal出来的view, 上半部分透明, 下班部分有V...

  • iOS12 使用 StoryBoard 显示模态 ViewCon

    iOS12 使用 StoryBoard 显示模态 ViewController 初学iOS开发,想实现弹出模态窗口...

  • Mac OSX - tips

    1:在模态窗口中弹出NSAlert提示框,NSAlert提示框消失后依然阻塞当前模态窗口,上面的类似输入框等鼠标事...

  • 模态弹出

    1、模态弹出2、模态返回 有时候不用不写,还真是想不到怎么做一、模态弹出这是在UIView里面弹出模态,因为模态只...

  • electron学习---BrowserWindow对象

    创建和控制浏览器窗口。 无边框窗口 优雅地显示窗口 父子窗口 模态窗口 模态窗口是禁用父窗口的子窗口,创建模态窗口...

  • 前端学习-jQuery实现模态框

    需求:当点击按钮计算器时,在窗口中间弹出模态框,可以计算,点击x关闭模态框效果图: 知识点总结:1、常用html标...

  • bootstrap模态框多层嵌套,背景滚动

    问题:在弹出模态框A的基础上,弹出模态框B,关闭模态框B之后,模态框A不能滚动(由于A模块框内容) 造成的原因:遮...

  • macos 使window始终在最上面

    2.查的资料有人用这个 但是如果这个window要弹出窗口,即使是模态窗口,也会在当前window后面,这种情况下...

  • vue-js-modal 模态弹出窗口

    基于Vue实现的Modal窗口,单独组件,方便使用,还很美观 更多精彩 更多技术博客,请移步 IT人才终生实训与职...

  • Qt 窗口 置顶功能/模式/非模式/半非模式

    窗口置顶 窗口取消置顶 模式/非模式/半非模式 type: Qt::NonModal 非模态:正常模式 Qt::W...

网友评论

      本文标题:Semi-Modal 半模态弹出窗口

      本文链接:https://www.haomeiwen.com/subject/mqxgrttx.html