学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

【译】Presenting a View Controller

添加一个视图弹窗到当前窗口,是选择view还是Controller实现?

有两种方法在屏幕上显示一个视图控制器:将它嵌入到容器视图控制器中或present它。容器视图控制器提供了应用程序的主要导航,但present视图控制器也是一个重要的导航工具。你使用直接表示来在当前视图控制器的顶部显示一个新的视图控制器。通常,当你想要实现模态交互时,你会present视图控制器,但你也可以将它们用于其他目的。

对presenting视图控制器的支持被内置到UIViewController类中,并且对所有视图控制器对象可用。你可以从任何其他视图控制器present任何视图控制器,尽管UIKit可能会将请求重新路由(reroute)到不同的视图控制器。Presenting一个视图控制器会在原始视图控制器(称为presenting视图控制器)和要显示的新视图控制器(称为presented视图控制器)之间创建一个关系。这个关系构成了视图控制器层次结构(hierarchy)的一部分,并一直存在,直到presented视图控制器被解散(dismissed)。

The Presentation and Transition Process

Presenting一个视图控制器是将新内容动画到屏幕上的一种快速而简单的方法。UIKit内建的表示机制(machinery)允许你使用内置或自定义动画来显示一个新的视图控制器。内置的presentations和动画只需要很少的代码,因为UIKit处理了所有的工作。您还可以创建自定义的presentations和动画,只需一点点额外的努力,并将它们与任何视图控制器一起使用。

你可以通过编程或使用segue来初始化视图控制器的presentation。如果你在设计时就知道应用的导航,segue是最简单的方式来启动presentations。对于更动态的交互,或者在没有专门的控件来启动segue的情况下,使用UIViewController的方法来present你的视图控制器。

Presentation Styles

视图控制器的presentation style决定了它在屏幕上的外观。UIKit定义了许多标准的表示样式,每种样式都有特定的外观和意图。您还可以定义自己的自定义表示样式。在设计你的应用程序时,选择对你想要做的事情最有意义的表现风格,并为你想要表现的视图控制器的modalPresentationStyle属性分配适当的常数。

Full-Screen Presentation Styles

全屏显示样式覆盖了整个屏幕,阻止了与底层内容的交互。在水平规则环境中(horizontally regular environment),只有一种全屏样式完全覆盖底层内容。其余的包含调光视图(dimming views)或透明度(transparency),以允许底层视图控制器的部分通过显示。在水平紧凑的环境中(horizontally compact environment),全屏演示自动适应UIModalPresentationFullScreen样式并覆盖所有底层内容。

图8-1演示了在水平规则环境中使用UIModalPresentationFullScreen、UIModalPresentationPageSheet和UIModalPresentationFormSheet样式的演示的外观。在图中,左上角的绿色视图控制器呈现右上方的蓝色视图控制器,每种呈现风格的结果如下所示。对于某些表示样式,UIKit会在两个视图控制器的内容之间插入一个调光视图( dimming view)。

Figure 8-1 The full screen presentation styles

当使用UIModalPresentationFullScreen样式呈现一个视图控制器时,UIKit通常在转换动画完成后删除底层视图控制器的视图。你可以通过指定UIModalPresentationOverFullScreen样式来阻止这些视图的移除。当呈现的视图控制器有透明区域,可以显示底层内容时,可以使用这种样式。

当使用一种全屏显示样式时,发起显示的视图控制器必须自己覆盖整个屏幕。如果presenting视图控制器没有覆盖屏幕,UIKit会沿着视图控制器层次结构向上走,直到找到一个覆盖屏幕的。如果UIKit找不到一个填充屏幕的中间视图控制器,它就会使用窗口的根视图控制器。

The Popover Style

UIModalPresentationPopover样式在弹窗视图(popover view.)中显示视图控制器。Popovers对于显示与焦点或选定对象相关的附加信息或项列表非常有用。在水平规则环境中,弹窗视图只覆盖屏幕的一部分,如图8-2所示。在水平紧凑的环境中,弹窗默认情况下适应UIModalPresentationOverFullScreen表示样式。在弹出窗口视图外点击会自动解除弹出窗口。

Figure 8-2 The popover presentation style

因为弹窗适应于水平紧凑环境中的全屏显示,所以通常需要修改弹窗代码来处理这种适应。在全屏模式下,你需要一种方法来dismiss弹出窗口。您可以通过添加一个按钮,将弹出窗口嵌入到dismissible的容器视图控制器中,或更改自适应行为本身来实现这一点。

有关如何配置弹出窗口表示的技巧,请参见在弹出窗口中呈现视图控制器。

The Current Context Styles

UIModalPresentationCurrentContext样式覆盖了你的界面中一个特定的视图控制器。当使用上下文样式时,你通过设置它的definesPresentationContext属性为YES来指定你想覆盖哪个视图控制器。图8-3展示了一个当前的上下文表示,它只覆盖了分屏视图控制器的一个子视图控制器。

Figure 8-3 The current context presentation style

当使用UIModalPresentationFullScreen样式呈现一个视图控制器时,UIKit通常在转换动画完成后删除底层视图控制器的视图。你可以通过指定UIModalPresentationOverCurrentContext样式来阻止这些视图的删除。当呈现的视图控制器有透明区域,可以显示底层内容时,可以使用这种样式。

定义presentation上下文的视图控制器还可以定义在表示期间使用的转换动画。通常,UIKit使用所呈现的视图控制器的modalTransitionStyle属性中的值在屏幕上动画视图控制器。如果表示上下文视图控制器将它的providesPresentationContextTransitionStyle设置为YES, UIKit使用该视图控制器的modalTransitionStyle属性中的值。

当转换到水平紧凑环境时,当前上下文样式适应UIModalPresentationFullScreen样式。要改变这种行为,请使用自适应表示委托来指定不同的表示样式或视图控制器。

Custom Presentation Styles

UIModalPresentationCustom样式让你使用你定义的自定义样式来呈现一个视图控制器。创建自定义样式包括子类化UIPresentationController,并使用它的方法将任何自定义视图动画到屏幕上,并设置presented view controller的大小和位置。presentation控制器还处理任何由于presented视图控制器的特征(traits)的变化而发生的适应性。

有关如何定义自定义表示控制器的信息,请参见创建自定义表示。

Presenting Versus Showing a View Controller

UIViewController类提供了两种方式来显示一个视图控制器:

  1. showViewController:sender:showDetailViewController:sender:方法提供了最适应性和最灵活的方式来显示视图控制器。这些方法让presenting视图控制器决定如何最好地处理presentation。例如,容器视图控制器可能将视图控制器合并(incorporate)为子视图控制器,而不是modal地呈现它。默认行为以模态方式呈现视图控制器。

  2. presentViewController:animated:completion:方法总是以模态方式显示视图控制器。调用此方法的视图控制器可能最终(ultimately)不会处理presentation,但presentation始终是模态的。此方法适用于水平紧凑环境的presentation样式。

方法showViewController:sender:showDetailViewController:sender:是发起展示(initiate presentations)的首选方式。视图控制器可以调用它们,而不需要知道视图控制器层次结构的其他部分或者当前视图控制器在那个层次结构中的位置。这些方法也使得在应用程序的不同部分重用视图控制器变得更容易,而无需编写条件代码路径。

Showing View Controllers

当使用showViewController:sender:和showDetailViewController:sender:方法时,在屏幕上获取一个新的视图控制器的过程很简单:

  1. 创建你想要呈现的视图控制器对象。当创建视图控制器时,你有责任用它执行任务所需的任何数据来初始化它。

  2. 将新视图控制器的modalPresentationStyle属性设置为首选的表示样式。这种风格可能不会在最终的演示中使用。

  3. 将视图控制器的modalTransitionStyle属性设置为所需的过渡动画样式。这种风格可能不会在最终的动画中使用。

  4. 调用当前视图控制器的showViewController:sender:和showDetailViewController:sender:方法。

UIKit将对showViewController:sender:和showDetailViewController:sender:方法的调用转发给相应的呈现视图控制器。然后视图控制器可以决定如何最好地执行表示,并可以根据需要更改表示和转换样式。例如,一个导航控制器可能会把视图控制器推到它的导航堆栈上。

有关显示视图控制器和模态显示视图控制器之间的区别的信息,请参见显示与显示视图控制器。

Presenting View Controllers Modally

当直接呈现一个视图控制器时,你告诉UIKit你希望新的视图控制器如何显示,以及它应该如何在屏幕上动画。

  1. 创建你想要呈现的视图控制器对象。
    当创建视图控制器时,你有责任用它执行任务所需的任何数据来初始化它。

  2. 将新视图控制器的modalPresentationStyle属性设置为所需的表示样式。

  3. 将视图控制器的modalTransitionStyle属性设置为所需的动画样式。

  4. 调用当前视图控制器的presentViewController:animated:completion:方法。

调用presentViewController:animated:completion:方法的视图控制器可能不是真正执行模式显示的那个。呈现风格决定了视图控制器如何被呈现,包括呈现视图控制器所需的特征。例如,全屏显示必须由全屏视图控制器发起。如果当前呈现的视图控制器不合适,UIKit会遍历视图控制器层次结构,直到找到一个合适的。模态呈现完成后,UIKit会更新受影响的视图控制器的presentingViewController和presenttedviewcontroller属性。

清单8-1演示了如何以编程方式表示视图控制器。当用户添加一个新食谱时,应用程序会通过一个导航控制器提示用户关于食谱的基本信息。选择一个导航控制器,这样就有一个标准的位置来放置“取消和完成”按钮。使用导航控制器还可以使将来更容易扩展新的食谱界面。你所要做的就是把新的视图控制器推到导航堆栈上。

1
2
3
4
5
6
7
8
9
10
11
//Listing 8-1 Presenting a view controller programmatically  
- (void)add:(id)sender {
// Create the root view controller for the navigation controller
// The new view controller configures a Cancel and Done button for the
// navigation bar.
RecipeAddViewController *addController = [[RecipeAddViewController alloc] init];

addController.modalPresentationStyle = UIModalPresentationFullScreen;
addController.transitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:addController animated:YES completion: nil];
}

Presenting a View Controller in a Popover

弹出窗口需要额外的配置才能显示它们。在将模态表示样式设置为UIModalPresentationPopover之后,配置以下与弹出窗口相关的属性:

  • 设置你的视图控制器的preferredContentSize属性为所需的大小。

  • 使用相关的UIPopoverPresentationController对象设置弹出窗口锚点,该对象可以从视图控制器的popoverPresentationController属性中访问。只需要设置以下其中一个:

    • 将barButtonItem属性设置为一个栏按钮项。

    • 将sourceView和sourceRect属性设置为一个视图中的特定区域。

你可以使用UIPopoverPresentationController对象根据需要对弹出窗口的外观进行其他调整。弹窗表示控制器还支持一个委托对象,您可以使用该对象在表示过程中响应更改。例如,当弹出窗口在屏幕上出现、消失或重新定位时,可以使用委托进行响应。有关该对象的更多信息,请参见UIPopoverPresentationController类参考。

参考

View Controller Programming Guide for iOS