这篇文章给大家聊聊关于高效ViewController编程指南:展示与过渡技巧解析,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
对呈现视图控制器的支持内置于UIViewController 类中,并且可供所有视图控制器对象使用。您可以从任何其他视图控制器呈现任何视图控制器,尽管UIKit 可能会将请求重新路由到不同的视图控制器。呈现视图控制器在原始视图控制器(称为呈现视图控制器)和正在呈现的新视图控制器(称为呈现视图控制器)之间创建关系。这种关系构成视图控制器层次结构的一部分,并保持不变,直到呈现的视图控制器被关闭。
展示与过渡过程
呈现视图控制器是一种在屏幕上设置新内容的快速且简单的方法。 UIKit 内置的呈现机制允许您使用内置或自定义动画呈现新的视图控制器。内置的演示和动画只需要很少的代码,因为UIKit 可以处理所有工作。您还可以创建自定义演示文稿和动画,无需额外的工作,并将它们与任何视图控制器一起使用。
您可以通过编程方式或使用Segues 来启动视图控制器的呈现。如果您在设计时了解应用程序的导航,那么Segues 是启动界面的最简单方法。对于更动态的界面,或者当没有专用控件来启动segue 时,请使用UIViewController 的方法来呈现视图控制器。
呈现方式
视图控制器的呈现模式控制其在屏幕上的外观。 UIKit 定义了许多标准的表示方法,每种方法都有特定的外观和意图。您还可以定义自己的自定义渲染。设计应用程序时,选择最适合您想要执行的操作的呈现方法,并在适当的时候将其分配给您想要呈现的视图控制器的modalPresentationStyle 属性。
全屏呈现方式
全屏渲染覆盖整个屏幕,阻止与底层内容交互。在水平常规环境中,只有一种全屏模式可以完全覆盖基本内容。其余部分包含暗淡视图或透明度,以允许底层视图控制器的部分显示。在水平紧凑的环境中,全屏演示会自动适应UIModalPresentationFullScreen 模式并覆盖所有底层内容。
图8-1 说明了在水平法线环境中使用uimodalpresentationfullscreen 和uimodalpresentationformsheet 样式的uimodalpresentationpagesheet 演示样式的外观。在图中,左上角的绿色视图控制器呈现右上角的蓝色视图控制器,每种显示样式的结果如下所示。对于某些呈现方法,UIKit 会在两个视图控制器的内容中插入一个暗淡的视图。
图8-1 全屏展示方式
VCPG_PresentationStyles _fig_8-1_2x.png注
当使用UIModalPresentationFullScreen 呈现视图控制器时,UIKit 通常
过渡动画完成后删除底层视图控制器的视图。您可以指定
UIModalPresentationOverFullScreen 样式可防止这些视图被删除。当呈现时
当图表控制器具有允许显示底层内容的透明区域时,您可以使用此样式。
当使用其中一种全屏演示方法时,启动演示的视图控制器本身必须覆盖整个屏幕。如果呈现的视图控制器没有覆盖屏幕,UIKit 会在视图控制器层次结构中查找覆盖全屏的视图控制器,直到找到一个。如果找不到填充屏幕的中间视图控制器,UIKit 将使用窗口的根视图控制器。
弹出方式
UIModalPresentationPopover 方法在弹出视图中显示视图控制器。弹出窗口可用于显示附加信息或与感兴趣或选择的对象相关的项目列表。在水平常规环境中,弹出视图仅覆盖部分屏幕,如图8-2所示。在水平紧凑环境中,弹出窗口默认适应UIModalPresentationOverFullScreen 演示。点击弹出窗口视图外部会自动关闭弹出窗口。
图8-2 弹窗呈现方式
VCPG_popover-style_2x.png 由于popover方法适合水平紧凑环境下的全屏显示,因此通常需要修改popover方法代码来处理适配。在全屏模式下,您需要一种方法来关闭显示的弹出窗口。您可以通过添加按钮将弹出窗口嵌入到可忽略的容器视图控制器中,或者更改自适应行为本身。
当前上下文方式
UIModalPresentationCurrentContext 样式涵盖界面中的特定视图控制器。使用上下文方法时,通过将其DefinitionsPresentationContext 属性设置为YES 来指定要覆盖的视图控制器。图8-3 显示了当前上下文的表示,仅覆盖分割视图控制器的一个子视图控制器。
图8-3 当前上下文呈现方式
VCPG_CurrentContextStyles_2x.png注
当使用UIModalPresentationFullScreen 呈现视图控制器时,UIKit 通常
过渡动画完成后删除底层视图控制器的视图。您可以指定
UIModalPresentationOverCurrentContext 样式可防止这些视图被删除。当呈现时
当视图控制器具有允许显示底层内容的透明区域时,您可以使用此方法。
定义呈现上下文的视图控制器还可以定义呈现期间使用的过渡动画。通常,UIKit 使用所呈现的视图控制器的modalTransitionStyle 属性中的值来为屏幕上的控制器设置动画。如果呈现上下文视图控制器的providesPresentationContextTransitionStyle 设置为YES,UIKit 将使用该视图控制器的modalTransitionStyle 属性中的值。
当转换到水平紧凑环境时,当前上下文样式会适应UIModalPresentationFullScreen 样式。要更改此行为,请使用自适应渲染委托来指定不同的渲染样式或视图控制器。
自定义呈现方式
UIModalPresentationCustom 方法允许您使用定义的自定义方法来呈现视图控制器。创建自定义方式涉及子类化UIPresentationController 并使用其方法将任何自定义视图动画显示到屏幕上,并设置所呈现的视图控制器的大小和位置。呈现控制器还处理由于呈现视图控制器的属性变化而发生的任何调整。
过渡方式
转换方法确定用于显示所呈现的视图控制器的动画类型。对于内置过渡,您可以将标准过渡分配给要显示的视图控制器的modalTransitionStyle 属性。当您呈现视图控制器时,UIKit 将创建与该样式相对应的动画。例如,图8-4 说明了标准上滑过渡(UIModalTransitionStyleCoverVertical) 如何在屏幕上为视图控制器设置动画。视图控制器B 从屏幕开始,并上下移动视图控制器A 的顶部。当视图控制器B 关闭时,动画会反转,以便B 向下滑动以显示A。
图8-4 视图控制器的过渡动画
VCPG_SlideTransition_fig_8-1_2x.png 您可以使用动画器对象和过渡委托创建自定义过渡。动画器对象创建过渡动画以将视图控制器放置在屏幕上。转换委托在适当的时间向UIKit 提供动画对象。
呈现或显示视图控制器
UIViewController 类提供两种显示视图控制器的方法:
showViewController:sender: 和showDetailViewController:sender: 方法提供了最具适应性和最灵活的方式来显示视图控制器。这些方法让呈现视图控制器决定如何最好地处理呈现。例如,容器视图控制器可以将视图控制器合并到子控制器中,而不是以模态方式呈现它。默认行为是以模态方式呈现视图控制器。 presentViewController:animated:completion: 方法始终以模态方式呈现视图控制器。调用此方法的视图控制器可能不会最终处理渲染,但渲染始终是模态的。该方法适应水平紧凑环境的呈现风格。 showViewController:sender: 和showDetailViewController:sender: 方法是开始呈现视图的首选方法。视图控制器可以调用它们,而无需了解视图控制器层次结构的其余部分或当前视图控制器在该层次结构中的位置。这些方法还使得在应用程序的不同部分中重用视图控制器变得更加容易,而无需编写条件代码路径。
呈现视图控制器
有多种方法可以启动视图控制器的呈现:
使用Segues 自动呈现视图控制器。 Segue 使用您在Interface Builder 中指定的信息实例化并呈现视图控制器。使用showViewController:sender: 或showDetailViewController:sender: 方法显示视图控制器。在自定义视图控制器中,您可以将这些方法的行为更改为更适合视图控制器的行为。调用presentViewController:animated:completion:方法以模态方式呈现视图控制器。
显示视图控制器
使用showViewController:sender: 和showDetailViewController:sender: 方法时,在屏幕上获取新视图控制器的过程非常简单:
创建要显示的视图控制器对象。当您创建视图控制器时,您有责任使用执行其任务所需的任何数据来初始化它。将新视图控制器的modalPresentationStyle 属性设置为首选呈现方法。最终渲染中可能不会使用这种方法。将视图控制器的modalTransitionStyle 属性设置为您想要的过渡动画方式。该方法可能不会在最终的动画中使用。调用当前视图控制器的showViewController:sender: 和showDetailViewController:sender: 方法。 UIKit 将对showViewController:sender: 和showDetailViewController:sender: 方法的调用转发给相应的呈现视图控制器。然后,视图控制器可以决定如何最好地执行渲染,并可以根据需要更改渲染和过渡样式。例如,导航控制器可以将视图控制器推送到其导航堆栈上。
模式地呈现视图控制器
直接呈现视图控制器时,您可以告诉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];
}
在弹出中呈现视图控制器
弹出窗口需要额外的配置才能显示它们。将模态呈现样式设置为UIModalPresentationPopover 后,配置以下弹出相关属性:
将视图控制器的preferredContentSize 属性设置为所需的大小。使用关联的UIPopoverPresentationController 对象设置弹出框锚点,该对象可从视图控制器的popoverPresentationController 属性访问。仅设置以下选项之一:
* 将barButtonItem 属性设置为栏按钮项。
* 将sourceView 和sourceRect 属性设置为视图之一中的特定区域。您可以根据需要使用UIPopoverPresentationController 对象对弹出窗口的外观进行其他调整。弹出演示控制器还支持委托对象,您可以使用该对象来响应演示期间的更改。例如,您可以使用代理在屏幕上出现、消失或重新定位弹出窗口时做出响应。
取消呈现的视图控制器
要关闭提交的视图控制器,请调用呈现视图控制器的dismissViewControllerAnimated:completion:方法。您还可以在呈现的视图控制器本身上调用此方法。当您在提供的视图控制器上调用此方法时,UIKit 会自动将请求转发到呈现的视图控制器。
在关闭视图控制器之前,始终保存视图控制器中的任何重要信息。取消视图控制器会将其从视图控制器层次结构中删除,并从屏幕上删除其视图。如果您没有对存储在其他地方的视图控制器的强引用,则关闭它会释放与其关联的内存。
如果呈现视图控制器必须将数据返回给呈现视图控制器,请使用委托设计模式来促进传输。委托使您可以更轻松地在应用程序的不同部分重用视图控制器。使用委托,所呈现的视图控制器存储对委托对象的引用,该对象实现表单协议中的方法。当它收集结果时,呈现视图控制器在其委托上调用这些方法。在典型的实现中,呈现视图控制器使自己成为它所呈现的视图控制器的委托。
尽管您可以在同一故事板中的视图控制器之间创建分段,但不能在故事板之间创建分段。当你想要显示存储在不同故事板中的视图控制器时,必须在显示它之前显式实例化视图控制器,如清单8-2所示。该示例以模态方式呈现视图控制器,但您可以将其推送到导航控制器或以其他方式显示。
清单8-2 从故事板加载视图控制器
UIStoryboard* sb=[UIStoryboardstoryboardWithName:@"SecondStoryboard"bundle:nil];
MyViewController* myVC=[sb instantiateViewControllerWithIdentifier:@"MyViewController"];
//配置视图控制器。
//显示视图控制器
【高效ViewController编程指南:展示与过渡技巧解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
刚开始学iOS开发,这个指南看起来很有帮助!
有16位网友表示赞同!
希望可以更深入讲解 ViewController 的生命周期,这总是让我感到困惑。
有10位网友表示赞同!
关注过渡效果很关键,想学习点新姿势!
有20位网友表示赞同!
视频教程总是比文字更容易理解,期待有示范视频!
有16位网友表示赞同!
对自定义过渡动画很有兴趣,希望能详细讲解原理和实现方法。
有5位网友表示赞同!
这个帖子太及时了,刚遇到一个关于 View Controller 展示的问题,来这里看看能不能解决!
有16位网友表示赞同!
学习 iOS 编程确实需要耐心,希望这份指南能给我一些方向。
有11位网友表示赞同!
对不同类型的过渡效果差异比较感兴趣,希望能看到案例对比。
有20位网友表示赞同!
iOS 开发的世界真宽广,我还需要多学习很多内容!
有13位网友表示赞同!
分享一下你最近学习到的 ViewController 技巧吧!
有14位网友表示赞同!
ViewController 的展示和过渡确实很考验技术功底,这个指南希望能帮我提升水平。
有18位网友表示赞同!
看名字应该覆盖了比较基础的知识,我期待了解更多高级场景。
有8位网友表示赞同!
iOS 开发还是挺有趣的,这个指南让我对学习的热情又增加了一份!
有13位网友表示赞同!
希望能看到一些经典案例,和实际项目结合更有意义。
有7位网友表示赞同!
对于新手来说,这份指南足够入门了,感谢作者分享资源!
有12位网友表示赞同!
期待这个指南能更新到最新的 iOS 版本内容!
有19位网友表示赞同!
学习一个软件开发框架都需要时间和耐心,我准备花时间好好研究一下 ViewController。
有5位网友表示赞同!
希望这个指南能解答一些我长期困扰的问题。
有11位网友表示赞同!
最近想尝试做一个项目用到 ViewController,正好来看看这份指南!
有11位网友表示赞同!
学习 iOS 开发是一个不断提升的过程,期待继续分享和交流!
有20位网友表示赞同!