sixth-多视图应用
多视图应用的常见类型
- 实用工具应用:音乐播放器、通讯录等
- 基于导航的应用:手机设置
- 工具栏:按钮间不冲突
- 标签栏:一次只能选其一
多视图应用的体系结构
- 启动时自加载蓝色视图界面,底部有工具栏,中间有按钮
- 点击工具栏按钮,动画切换视图变成黄色
- 按下中间按钮会弹出警告框
根控制器
- 负责管理当前向用户显示哪个视图。是UINavigationController或UITabBarController的一个实例
- 也可以是UIViewController的一个子类
- 容器视图控制器
内容视图
- 每个视图控制器控制一个内容视图,它们一起组成的组合在storyboard中被称为场景
- 一般都会使用界面构建场景,这种方式省时且易于维护
构建View Switcher项目
- 重命名视图控制器
- 进入声明文件,点击视图控制器的位置Refactor -> Rename
- Xcode快照功能Snapshot
- 添加内容视图控制器(2个类)
- 添加视图控制器属性声明
- 创建拥有工具栏视图Toolbar并固定它
- 链接工具栏按钮和视图控制器(文档略图中从按钮位置向上拖线到视图控制器,选择方法,或crl+opt+cmd+6相关连线)
- 编写视图控制器
- 转场过程的动画效果
其他
- 添加其他场景时要记得修改场景所继承的父类
- Constrain to margins不勾选则是跟边缘的距离,勾选则是跟边缘蓝色引线的距离
- Pin里最下Update Frames : Item of New Constraints 更新新创建的约束
代码
#import "SwitchingViewController.h"
#import "YellowViewController.h"
#import "BlueViewController.h"
#pragma mark 私有声明
@interface SwitchingViewController ()
@property (strong, nonatomic) YellowViewController *yellowViewController;
@property (strong, nonatomic) BlueViewController *blueViewController;
@end
#pragma mark 实现
@implementation SwitchingViewController
#pragma mark 启动自加载
- (void)viewDidLoad {
[super viewDidLoad];
self.blueViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Blue"];
self.blueViewController.view.frame = self.view.frame;
[self switchViewFromViewController:nil toViewController:self.blueViewController];
}
#pragma mark 切换视图
- (IBAction)switchView:(id)sender {
if (!self.yellowViewController.view.superview) {
if (!self.yellowViewController) {
self.yellowViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
}
} else {
if (!self.blueViewController) {
self.blueViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Blue"];
}
}
[UIView beginAnimations:@"View Flip" context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
if (!self.yellowViewController.view.superview) {
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
self.yellowViewController.view.frame = self.view.frame;
[self switchViewFromViewController:self.blueViewController toViewController:self.yellowViewController];
} else {
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
self.blueViewController.view.frame = self.view.frame;
[self switchViewFromViewController:self.yellowViewController toViewController:self.blueViewController];
}
[UIView commitAnimations];
}
#pragma mark 切换视图控制器
- (void)switchViewFromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {
if (fromVC != nil) {
[fromVC willMoveToParentViewController:nil];
[fromVC.view removeFromSuperview];
[fromVC removeFromParentViewController];
}
if (toVC != nil) {
[self addChildViewController:toVC];
[self.view insertSubview:toVC.view atIndex:0];
[toVC didMoveToParentViewController:self];
}
}
@end