大家好,关于深入解析:iOS视图控制器(第八篇)——掌握Present视图控制器技术很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
UIViewController 类支持当前的视图控制器,并且可以与所有视图控制器对象一起使用。尽管UIKit 可能会将请求重新路由到不同的视图控制器,但您可以在任何其他视图控制器上呈现任何视图控制器。呈现视图控制器在原始视图控制器(称为呈现视图控制器)和呈现的新视图控制器(称为呈现视图控制器)之间创建关系。这种关系是视图控制器层次结构的一部分,直到呈现的视图控制器被关闭为止。
展示和过渡的过程
呈现视图控制器是向屏幕引入新内容的一种快速且简单的方法。 UIKit 有一个内置的呈现机制,允许使用内置或自定义动画来显示新的视图控制器。内置的演示和动画只需要很少的代码,因为UIKit 可以处理所有工作。您还可以在任何视图控制器中轻松创建自定义演示文稿和动画。
您可以通过编程方式或使用segue 来启动视图控制器的演示。如果您在设计时了解应用程序的导航,那么Segues 是启动演示的最简单方法。对于更动态的界面,或者当没有专用控件来启动segue 时,请使用UIViewController 方法来呈现视图控制器。
Presentation Styles
呈现样式是管理其在屏幕上的外观的视图控制器。 UIKit 定义了许多标准的呈现样式,每种样式都有特定的外观和意图。您还可以定义自定义演示样式。设计应用程序时,请为应用程序选择适当的呈现样式,并将适当的常量分配给要呈现的视图控制器的modalPresentationStyle 属性。
Full-Screen Presentation Styles
全屏演示样式覆盖整个屏幕,阻止与底层内容交互。在水平常规环境中,只有全屏样式才能完全覆盖底层内容。其余视图变暗或具有透明度,允许部分底层视图控制器可见。在水平紧凑的环境下,全屏呈现模式自动采用UIModalPresentationFullScreen样式并覆盖所有底层内容。
图8-1 说明了在水平传统环境中使用UIModalPresentationFullScreen、UIModalPresentationPageSheet 和UIModalPresentationFormSheet 样式演示方法的外观。图中,左上角的绿色视图控制器呈现了右上角的蓝色视图控制器。各种演示风格如下。对于某些呈现样式,UIKit 在两个视图控制器的内容之间插入半透明视图。
图8-1 全屏呈现方式注意事项
当使用UIModalPresentationFullScreen 样式呈现视图控制器时,UIKit 通常会在过渡动画完成后删除底层视图控制器的视图。您可以通过指定UIModalPresentationOverFullScreen 样式来防止删除这些视图。当当前视图控制器具有允许显示底层内容的透明区域时,可以使用此样式。
当使用演示风格时,视图控制器启动的演示必须覆盖整个屏幕。如果呈现的视图控制器没有覆盖整个屏幕,UIKit 会遍历视图控制器层次结构,直到找到覆盖整个屏幕的视图控制器。如果找不到中间视图控制器来填充屏幕,UIKit 将使用窗口的根视图控制器。
The Popover Style
UIModalPresentationPopover 样式在视图控制器上显示为弹出窗口。弹出窗口用于显示附加信息或项目列表中选定的对象。在横向常规环境中,弹出视图仅覆盖屏幕的一部分,如图8-2 所示。在水平紧凑的环境中,弹出窗口默认使用UIModalPresentationOverFullScreenpresent。在弹出窗口视图外部单击,弹出窗口视图将自动关闭。
图8-2 弹窗呈现方式由于在水平紧凑的环境下,popover 采用全屏呈现方式,因此通常需要修改popover 代码来处理适配。在全屏模式下,需要一种方法来丢弃当前的弹出窗口。您可以通过向将被关闭的容器视图控制器添加按钮来嵌入弹出窗口,或者更改自适应行为本身。
有关如何配置弹出窗口,请参阅在弹出窗口中呈现视图控制器。
The Current Context Styles
UIModalPresentationCurrentContext 样式覆盖了界面中的特殊视图控制器。使用上下文样式时,通过将DefinesPresentationContext 属性设置为YES 来指定要覆盖的视图控制器。图8-3说明当前上下文仅覆盖分屏视图控制器的一个子视图控制器。
图8-3 当前环境呈现风格说明
当使用UIModalPresentationFullScreen 样式来呈现视图控制器时,UIKit 通常会在过渡动画完成后删除底层视图控制器的视图。您可以设置UIModalPresentationOverCurrentContext 样式以防止删除这些视图。当当前视图控制器具有允许显示底层内容的透明区域时,可以使用此样式。
定义视图控制器还可以定义当前过程中的过渡动画。通常,当使用当前视图控制器的modalTransitionStyle 属性时,UIKit 会将视图控制器渲染到屏幕上。如果当前上下文视图控制器的providesPresentationContextTransitionStyle值设置为YES,UIKit将使用视图控制器的modalTransitionStyle属性。
当过渡到水平紧凑环境时,当前上下文样式采用UIModalPresentationFullScreen 样式。要更改此行为,请使用自适应呈现委托来指定不同的呈现样式或视图控制器。
Custom Presentation Styles
UIModalPresentationCustom 样式使用自定义样式来呈现视图控制器。创建自定义样式涉及对UIPresentationController 进行子类化,使用其方法将任何自定义视图渲染到屏幕上并设置当前视图控制器的大小和位置。当前的控制器还处理由于视图控制器特征的变化而引起的适应。
有关如何定义自定义呈现视图控制器的信息,请参阅创建自定义呈现。
Transition Styles
过渡样式决定用于显示当前视图控制器的动画类型。对于内置过渡样式,您可以为当前视图控制器的modalTransitionStyle 属性指定标准过渡样式。当呈现视图控制器时,UIKit 创建相应的动画样式。例如,图8-4 说明了标准上滑过渡(UIModalTransitionStyleCoverVertical) 视图控制器如何呈现到屏幕上。视图控制器B 在屏幕外启动并覆盖视图控制器A。当视图控制器B 关闭时,动画将反转,B 向下滑动以显示A。
图8-4 视图控制器过渡动画可以使用动画对象和过渡代理来创建自定义过渡。动画对象为放置在屏幕上的视图控制器创建过渡动画。转换代理在适当的时间向UIKit 提供动画对象。有关如何实现自定义过渡的更多信息,请参阅自定义过渡动画。
present和显示一个视图控制器
UIViewController 类提供了两种显示视图控制器的方法:
showViewController:sender: 和showDetailViewController:sender: 方法为显示视图控制器提供了最大的适应性和灵活性。这些方法让当前视图控制器决定如何最好地处理演示。例如,容器视图控制器可能会将视图控制器合并为子视图控制器,而不是以模态方式呈现它。默认情况下,视图控制器以模态方式呈现。 presentViewController:animated:completion: 方法始终以模态方式呈现视图控制器。调用此方法的视图控制器可能不会最终处理呈现,但始终会以模态方式呈现它。在水平紧凑环境中,该方法采用目前的风格。 showViewController:sender: 和showDetailViewController:sender: 方法是开始呈现的首选方法。视图控制器可以调用它们,而无需了解有关视图控制器层次结构或当前视图控制器在层次结构中的位置的任何信息。这些方法使重用视图控制器变得更加容易,而无需编写条件代码路径。
present视图控制器
有多种方式来呈现视图控制器:
使用Segues 自动呈现视图控制器。使用界面生成器指定的信息,segue 实例化并呈现视图控制器。有关如何配置Segue 的更多信息,请参阅使用Segue。使用showViewController:sender: 和showDetailViewController:sender: 方法显示视图控制器。在您的自定义视图控制器中,您可以更改这些方法的行为以更好地适合您的视图控制器。调用presentViewController:animated:completion:方法以模态方式呈现视图控制器。有关如何消除使用这些技术呈现的视图控件的更多信息,请参阅消除呈现的视图控制器。
显示视图控制器
使用和方法时,在屏幕上获取新视图控制器的过程很简单:
创建您想要呈现的视图控制器对象。创建视图控制器时,您负责初始化执行任何操作所需的任何数据。将新视图控制器的modalPresentationStyle 属性设置为首选的当前样式。最终演示中可能不会使用此样式。设置视图控制器的modalTransitionStyle 属性来设置所需的过渡动画样式。最终演示中可能不会使用此样式。调用当前视图控制器的showViewController:sender: 和showDetailViewController:sender: 方法。 UIKit 将对showViewController:sender: 和showDetailViewController:sender: 方法的调用转发到当前视图控制器。视图控制器可以决定如何最好地执行演示,并可以根据需要更改演示和转换样式。例如,导航控制器可能会将视图控制器推送到导航堆栈上。
有关呈现视图控制器和模态呈现视图控制器之间的差异的信息,请参阅呈现与显示视图控制器。
以模态的方式present视图控制器
直接呈现视图控制器时,您需要告诉UIKit 您希望视图控制器如何显示并渲染到屏幕上。
创建您想要呈现的视图控制器对象。当您创建视图控制器时,您负责初始化执行任何操作所需的任何数据。
将新视图控制器的modalPresentationStyle 属性设置为所需的呈现样式。将视图控制器的modalTransitionStyle 属性设置为所需的动画样式。调用当前视图控制器的presentViewController:animated:completion:方法。调用presentViewController:animated:completion:方法的视图控制器可能不是最终执行模态呈现的视图控制器。呈现风格决定了视图控制器的呈现方式,包括呈现视图控制器所需的特征。例如,全屏演示必须由全屏视图控制器启动。如果当前存在的视图控制器不合适,UIKit 会遍历视图控制器层次结构,直到找到合适的视图控制器。完成模式呈现后,UIKit 会更新受影响视图控制器的presentingViewController 和presentedViewController 属性。
清单8-1 演示了如何以编程方式呈现视图控制器。当用户添加新的视图控制器时,应用程序会提示用户输入有关当前导航视图控制器的基本信息。选定的导航控制器将“取消”和“完成”按钮放置在标准位置。使用导航控制器可以更轻松地扩展新界面。您所需要做的就是将新的视图控制器推送到导航堆栈上。
清单8-1 以编程方式呈现视图控制器
(void)add:(id)sender {//为导航控制器创建根视图控制器//新的视图控制器为导航栏配置取消和完成按钮//RecipeAddViewController *addController=[[RecipeAddViewController alloc] init] ;addController.modalPresentationStyle=UIModalPresentationFullScreen;addController.transitionStyle=UIModalTransitionStyleCoverVertical;[selfpresentViewController:addControlleranimated:YEScompletion: nil];}
以弹窗形式present视图控制器
在呈现视图控制器之前,弹出窗口需要额外配置。将modal呈现样式设置为UIModalPresentationPopover后,配置popover相关属性:
将视图控制器的preferredContentSize 属性设置为所需的大小。使用关联的UIPopoverPresentationController 对象设置弹出框锚点,该对象可用于视图控制器的popoverPresentationController 属性。设置其中之一: - 将属性设置为栏按钮。 -设置sourceView和sourceRect属性来指定特定的视图区域。您可以在需要时使用UIPopoverPresentationController 对象调整弹出窗口的外观。弹窗呈现控制器还支持代理对象,可以用来响应呈现过程中的变化。例如,您可以使用代理来响应弹出窗口在屏幕上出现、消失或重新定位。有关此对象的更多信息,请参阅UIPopoverPresentationController 类参考。
dismiss一个presented的视图控制器
调用呈现视图控制器的dismissViewControllerAnimated:completion:方法来关闭呈现的视图控制器。您可以在视图控制器本身提供的方法中执行此操作。当呈现的视图控制器调用此方法时,UIKit 会自动将请求转发到呈现的视图控制器。
在关闭视图控制器之前保存所有重要信息。关闭视图控制器会将其从视图控制器层次结构中删除,并从屏幕上删除视图。如果视图控制器存储在其他地方而没有强引用,则关闭视图控制器会释放与其关联的内存。
如果呈现视图控制器必须将数据返回到呈现视图控制器,请使用委托设计模式来完成传输。委托使重用应用程序视图控制器变得更加容易。使用代理,所呈现的视图控制器存储对代理对象的引用并实现正式协议的方法。呈现的视图控制器在委托上调用这些方法来收集结果。在典型的实现中,呈现视图控制器充当呈现视图控制器的委托。
present在不同storyboard种定义的视图控制器
虽然可以在同一Storyboard 中的两个视图控制器之间创建Segue,但不能在不同Storyboard 中创建Segue。当你想要显示存储在另一个故事板中的视图控制器时,你必须在呈现之前显式实例化视图控制器,如清单8-2所示。该示例以模态方式呈现视图控制器,但您可以将其推送到导航控制器或以其他方式显示。
清单8-2 在故事板中加载视图控制器
UIStoryboard* sb=[UIStoryboardstoryboardWithName:@"SecondStoryboard"bundle:nil];MyViewController* myVC=[sb instantiateViewControllerWithIdentifier:@"MyViewController"];//配置视图控制器//显示视图控制器[selfpresentViewController:myVCanimated:YEScompletion333 60nil];
不需要在您的应用程序中创建多个故事板。但是,在以下情况下,多个故事板可能会很有用:
【深入解析:iOS视图控制器(第八篇)——掌握Present视图控制器技术】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于等到这篇文章了!一直想学习如何使用 Present 模式的跳转。
有13位网友表示赞同!
这个系列的文章写的太棒了,我已经从第一篇就跟着学习到第八篇了。
有13位网友表示赞同!
iOS开发中转场景的技巧真不少,Present 是其中比较常见的一种啦。
有12位网友表示赞同!
感觉这篇文章会教会我如何用代码实现视图控制器之间的动态跳转。
有11位网友表示赞同!
学习编程一定要循序渐进,这篇指南正好可以帮助我更深入理解 iOS 的界面层级结构。
有11位网友表示赞同!
之前没有注意到 Present 模式的应用场景,希望这篇文章能让我开阔视野。
有16位网友表示赞同!
我一直是用Storyboard的方式来管理视图控制器跳转的,现在尝试用代码实现也挺有挑战性的。
有18位网友表示赞同!
看标题感觉这篇指南会讲解如何使用Present 出来的视图控制器的各种属性和方法。很期待!
有18位网友表示赞同!
iOS 方面的学习一直都是一个持续的过程,这篇文章能帮助我进一步提升我的技能水平。
有8位网友表示赞同!
最近在做一款 iOS 应用项目,正好需要用到 View Controller 的 Present 模式,这篇指南来得好!
有10位网友表示赞同!
对于编程新手来说,这类指南的讲解非常清晰易懂。谢谢作者的分享!
有6位网友表示赞同!
感觉 Present 也是一个挺巧妙的设计方案,能使界面结构更加灵活变通。
有11位网友表示赞同!
希望能看到一些具体的代码示例,这样更容易理解和操作。
有5位网友表示赞同!
学习完这篇文章后,我要尝试把之前的项目代码优化一下,看看能不能用 Present 模式来设计更简洁的页面跳转流程。
有17位网友表示赞同!
希望作者能继续创作更多关于 iOS 开发的优秀文章!
有9位网友表示赞同!
iOS 的 UI 设计真是太精彩了,Present 模式就是最典型的例子之一。学习起来真的很有乐趣。
有5位网友表示赞同!
这篇文章一定能让我想了解更多的关于 iOS 视图控制器编程的相关知识点。
有18位网友表示赞同!
从基础到进阶,我希望能通过作者的系列文章一步一步地掌握 iOS 开发的精髓!
有13位网友表示赞同!
这篇文章让我对 Present 模式的应用场景有了更深刻的理解,非常感谢分享!
有18位网友表示赞同!