sixth-多视图应用

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];
    // Do any additional setup after loading the view, typically from a nib.

    // 创建蓝视图控制器的实例,并设置标识符“Blue”
    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];

    /* 动画效果:
     1. FlipFromRight :从右向上翻
     2. FlipFromLeft  :从左向上翻
     3. CurlUp :右下角向上翻
     4. CurDown:左上角向下翻
     5. None:没效果
     **/
    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];
        // 将子视图控制器的视图添加到容器视图控制器视图中,索引值为0表示把它放在最底层
        [self.view insertSubview:toVC.view atIndex:0];
        // 通知即将到来的控制器,它已经被作为子控制器添加到其他控制器下
        [toVC didMoveToParentViewController:self];
    }
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值