IOS UI:弹出视图/弹出模态 presentViewController与presentModalViewController(增加IOS 6.0说明)

一、主要用途

  弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等。弹出模态ViewController主要使用于一下这几种情形:

  1、收集用户输入信息

  2、临时呈现一些内容

  3、临时改变工作模式

  4、相应设备方向变化(用于针对不同方向分别是想两个ViewController的情况)

  5、显示一个新的view层级

  这几种情形都会暂时中断程序正常的执行流程,主要作用是收集或者显示一些信息。

二、几个概念和常用设置

1、presenting view controller Vs presented view controller

  当我们在view controller A中模态显示view controller B的时候,A就充当presenting view controller(弹出VC),而B就是presented view controller(被弹出VC)。官方文档建议这两者之间通过delegate实现交互,如果使用过UIImagePickerController从系统相册选取照片或者拍照,我们可以发现imagePickerController和弹出它的VC之间就是通过UIImagePickerControllerDelegate实现交互的。因此我们在实际应用用,最好也遵守这个原则,在被弹出的VC中定义delegate,然后在弹出VC中实现该代理,这样就可以比较方便的实现两者之间的交互。

2、Modal Presentation Styles(弹出类型)

  通过设置presenting VC的modalPresentationStyle属性,我们可以设置弹出View Controller时的类型,有以下四种类型,其定义如下:

typedef enum {
    UIModalPresentationFullScreen = 0,
    UIModalPresentationPageSheet,
    UIModalPresentationFormSheet,
    UIModalPresentationCurrentContext,
} UIModalPresentationStyle;

  UIModalPresentationFullScreen代表弹出VC时,presented VC充满全屏,如果弹出VC的wantsFullScreenLayout设置为YES的,则会填充到状态栏下边,否则不会填充到状态栏之下。

  UIModalPresentationPageSheet代表弹出是弹出VC时,presented VC的高度和当前屏幕高度相同,宽度和竖屏模式下屏幕宽度相同,剩余未覆盖区域将会变暗并阻止用户点击,这种弹出模式下,竖屏时跟UIModalPresentationFullScreen的效果一样,横屏时候两边则会留下变暗的区域。

  UIModalPresentationFormSheet这种模式下,presented VC的高度和宽度均会小于屏幕尺寸,presented VC居中显示,四周留下变暗区域。

  UIModalPresentationCurrentContext这种模式下,presented VC的弹出方式和presenting VC的父VC的方式相同。

  这四种方式在iPad上面统统有效,但在iPhone和iPod touch上面系统始终已UIModalPresentationFullScreen模式显示presented VC。

3、Modal Transition Style(弹出时的动画风格)

  通过设置设置presenting VC的modalTransitionStyle属性,我们可以设置弹出presented VC时场景切换动画的风格,其定义如下:

typedef enum {
        UIModalTransitionStyleCoverVertical = 0,//底部滑入
        UIModalTransitionStyleFlipHorizontal,	//水平翻转进入
        UIModalTransitionStyleCrossDissolve,	//交叉溶解
        UIModalTransitionStylePartialCurl,	//翻页
} UIModalTransitionStyle;

  我们可以看到有从底部滑入,水平翻转进入,交叉溶解以及翻页这四种风格可选。这四种风格在不受设备的限制,即不管是iPhone还是iPad都会根据我们指定的风格显示转场效果。

4、Present Modal ViewController(弹出VC)

调用presentViewController:animated:completion:即可弹出VC。

5、Dismiss Modal ViewController(消失弹出的VC)

  消失presented VC,我们可以通过调用dismissViewControllerAnimated:completion:来完成

  谁来调用这消失presented VC的这个方法:正确的做法是“谁污染谁治理”,即presenting VC调用上面的方法来取消presented VC的显示。这样做有一个好处,如果一个VC真不用户做的不同选择可能弹出不同的view controller,当不再需要显示被弹出的view controller的时候,直接调用[self dismissViewControllerAnimated:completion:]即可使之消失,而不用去关心其具体显示的哪一类view controller。当然系统在这里做了优化,当我们在presented VC里面调用上面的方法的时候,系统会自动的将这个消息传递到相应的presenting VC中,这样就可以实现不管谁弹出了自己,当不再需要的时候直接将自己消失掉的功能。在应用中具体要采用那种要看具体情况,如果presented VC需要和presenting VC有数据传递的话,建议在presenting VC实现的代理函数中dismiss弹出的view controller。

6、IOS6.0更新

presentModalViewController:animated:dismissModalViewControllerAnimated:这两个函数在6.0中均被废弃,不建议使用。


(转自:http://blog.csdn.net/sunshinexyj/article/details/8476248#comments)


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现一个弹出覆盖全屏的子视图,您可以使用SwiftUI中的`sheet`modifier。 以下是一个示例代码: ``` struct ContentView: View { @State private var showModal: Bool = false var body: some View { Button(action: { self.showModal = true }) { Text("Show Modal") } .sheet(isPresented: $showModal) { ModalView() } } } struct ModalView: View { var body: some View { Text("This is a modal view") .padding() .background(Color.white) } } ``` 在这个代码中,我们使用了`sheet`modifier,并将其绑定到了`showModal`状态。 当按钮被按下时,我们将`showModal`设置为`true`,这将导致视图弹出。 当`showModal`为`false`时,视图将不再可见。 ### 回答2: 要实现SwiftUI中子视图弹出并覆盖全屏的效果,可以使用Modal视图来实现。Modal视图是一种特殊类型的视图,它可以在当前视图的顶部弹出并覆盖全屏。 首先,需要创建一个状态变量来控制模态视图是否弹出。可以使用`@State`属性包装器来创建一个布尔类型的状态变量,例如`isModalShown`。 然后,在主视图的body中,将子视图作为模态视图的内容,使用`Modal`视图包装子视图,并将isPresented参数绑定到isModalShown状态变量。这样,当isModalShown为true时,模态视图弹出并覆盖全屏。 以下是一个示例代码: ``` struct ContentView: View { @State private var isModalShown = false var body: some View { Button("弹出视图") { self.isModalShown = true } .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) .sheet(isPresented: $isModalShown) { ChildView() } } } struct ChildView: View { var body: some View { VStack { Text("这是子视图") .font(.title) .foregroundColor(.blue) .padding() Button("关闭") { // 在子视图中使用self.presentationMode来关闭模态视图 self.presentationMode.wrappedValue.dismiss() } .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } } ``` 在这个例子中,主视图包含一个按钮,点击按钮会将isModalShown状态变量设置为true,从而弹出视图。子视图中有一个关闭按钮,点击该按钮会使用presentationMode来关闭模态视图。 通过这种方式,就可以实现子视图弹出并覆盖全屏的效果。 ### 回答3: 要实现SwiftUI中子视图弹出并覆盖全屏的效果,可以按照以下步骤进行: 1. 创建一个用于管理状态的变量,用来控制子视图的显示与隐藏。 ```swift @State private var isShowingSubview = false ``` 2. 在主视图中添加一个按钮,用于触发子视图弹出。 ```swift Button(action: { isShowingSubview = true }) { Text("显示子视图") } ``` 3. 在主视图中使用`ZStack`布局,将子视图叠加在主视图之上,并使用条件语句控制子视图的显示与隐藏。 ```swift ZStack { // 主视图的内容 if isShowingSubview { // 子视图,使用全屏覆盖整个主视图 } } ``` 4. 在子视图中添加关闭按钮,并绑定一个动作,以便在关闭按钮被点击时隐藏子视图。 ```swift Button(action: { isShowingSubview = false }) { Image(systemName: "xmark") .foregroundColor(.white) } ``` 至此,你已经完成了自己实现SwiftUI视图弹出并覆盖全屏的效果。 请注意,以上仅为实现效果的基本思路。具体实现方式可能会因为你在项目中所需的布局和逻辑而有所变化。如果需要更加详细的代码实现示例,请提供更具体的需求,以便我为你提供更准确的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值