iOS_20_微博Dock的尾随切换

终于效果图:Dock尾随HomeVC一起切换

要求:

当点击HomeVC里面的微博列表的某一行时候,

push到StatusDetail微博详情控制器,而且Dock也一起消失

当点击StatusDetail微博详情控制器上面的左边返回button,Dock也跟着HomeVC一起回来

HomeVC.m

// 点击列表中的一条微博,创建一个StatusDetailViewController,并为其成员status赋值(数据来源),并通过导航push入栈
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 创建一个微博正文详情控制器,
    StatusDetailViewController *detailVC = [[StatusDetailViewController alloc] init];
    // 为即将跳转的微博正文控制器,传递weibo数据(以供其显示用)
    StatusListCellFrame *statusListCellFrame = _statusCellFrames[indexPath.row];
    detailVC.status = statusListCellFrame.status;
    // 通过导航控制器跳转过去
    [self.navigationController pushViewController:detailVC animated:YES];
}

如上图所看到的,

主控制器(BeyondVC)的view包括两个部分:

1,上部的导航控制器 
2,以下的Dock

上部的导航控制器的view又包含两个部分:

1,上部的导航条(push的时候,它始终不动)

2,下部的根控制器(HomeVC)(push的时候会动画切换)

为了让Dock和导航控制器的根控制(HomeVC)能一起滑过去,又可以一起滑回来,

必须让主控制器(BeyondVC)成为导航控制器的代理,

使之可以监听push动作之willShowViewController和didShowViewController方法

在以下的willShowViewController方法中,

先将Dock从主控制器(BeyondVC)上移除,然后加入到导航控制器的根控制(HomeVC)里面

导航控制器的代理方法     willShowViewController

#pragma mark - 导航控制器的代理方法
// 屏幕宽 320
#define kWinWidth self.view.bounds.width
// 屏幕高 480
#define kWinHeight self.view.bounds.height
// 顶部状态条 20
#define kStatusBarHeight 20

// 目的是,监听push动作,在新控制器将进入栈顶时,设置左边button为返回箭头,设置右边button为回到首页
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //重要~~~~
    // 先取得根控制器
    UIViewController *rootVC = navigationController.viewControllers[0];

    // 假设将要显示的控制器(将被push入栈的), 不是栈底控制器(根控制器)。才须要设置左边为返回button,右边为首页button
    if (viewController != rootVC) {

        // 左边的返回到上一个控制器
        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithBgIcon:@"navigationbar_back.png" target:self action:@selector(popToPreviousVC)];

        // 右边的回到首页button,即回到栈底控制器(即从详情页回到列表页)
        viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithBgIcon:@"navigationbar_home.png" target:self action:@selector(backToRootVC)];

        // 1,先拉长导航控制器的view的高度 为整个窗体的高度-20 (由于dock消失后,底部会多空出黑色的空间)
        navigationController.view.frame = CGRectMake(0, 20,320,480 - 20);

        // 2,先让Dock从主控制器(BeyondViewController)的view上移除
        [_dock removeFromSuperview];

        // 3,为了在Push下一个控制器,让dock和根控制器一起平移,所以,加入dock到导航控制器的根控制器的view上 ,并又一次调整Dock在HomeVC的view中的Y值就可以,注意导航不会移动,移的是导航的根控制器,而根控制器的原点(0 0)是 :20+导航栏高度44

        // 假设根控制器是能够滚动的,则要注意y的原点是在tableView的顶部(当向下滚了一定的距离之后)
        if ([rootVC.view isKindOfClass:[UIScrollView class]]) {
            UIScrollView * scrollV =  (UIScrollView *)rootVC.view;
            // dock的导航控制器的根控制器里面的y值
            // 由于滚动之后,rootView的左上角到顶上非常远的地方了
            _dock.frame =CGRectMake(0, scrollV.contentOffset.y + 460 - kDockHeight, 320, kDockHeight );
        } else {
            // dock的导航控制器的根控制器里面的y值
            _dock.frame =CGRectMake(0, 480 - 20 - 2*kDockHeight, 320, kDockHeight );

        }
        // 4,最后再加入dock到导航控制器的根控制器里面(rootVC界面上(即导航控制器的根控制器),目的是push新的VC的时候,让dock和导航控制器的根控制器一起平移到界面的左边去,当点击返回键的时候,dock又能和rootVC一起回来
        [rootVC.view addSubview:_dock];

    }
}

在以下的didShowViewController方法中,

先将Dock从导航控制器的根控制(HomeVC)上移除,然后加入到主控制器(BeyondVC)里面

导航控制器的代理方法    didShowViewController

// 导航控制器的Y = 20,导航控制器的高度 =  总高度 - DOCK高度 - 20
#define kContentFrame CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - kDockHeight - 20)

// BeyondVC主控制器中,DOCK的Y = 总高度 - DOCK高度
#define KDockFrame CGRectMake(0, self.view.frame.size.height - kDockHeight, self.view.frame.size.width, kDockHeight)

// 目的是,监听push动作,在新控制器已经显示的时候,将dock从导航控制器中移除,再又又一次显示到主控制器
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // 先取得导航 的栈底的根控制器
    UIViewController *rootVC = navigationController.viewControllers[0];
    // 假设要显示的控制器是根控制器,又一次把Dock
    if (viewController == rootVC) {
        // 更改导航控制器view的frame
        // 导航控制器的Y = 20,导航控制器的高度 =  总高度 - DOCK高度 - 20
        navigationController.view.frame = kContentFrame;

        // 将Dock先从栈底的根控制器rootVC上移除
        [_dock removeFromSuperview];

        // 再加入dock到BeyondViewController,DOCK的Y = 总高度 - DOCK高度
        _dock.frame = KDockFrame;
        [self.view addSubview:_dock];
    }
}

这样就实现了,让主控制器里面的Dock尾随导航控制器的根控制器,一起消失,又一起回来~

时间: 2024-10-20 02:04:44

iOS_20_微博Dock的尾随切换的相关文章

iOS_20_微博Dock的跟随切换

最终效果图:Dock跟随HomeVC一起切换 要求: 当点击HomeVC里面的微博列表的某一行时候, push到StatusDetail微博详情控制器,并且Dock也一起消失 当点击StatusDetail微博详情控制器上面的左边返回按钮,Dock也跟着HomeVC一起回来 HomeVC.m // 点击列表中的一条微博,创建一个StatusDetailViewController,并为其成员status赋值(数据来源),并通过导航push入栈 - (void)tableView:(UITable

iOS_20_微博自定义可动画切换的导航控制器

最终效果: AnimatedNavigationController.h // // AnimatedNavigationController.h // 20_帅哥no微博 // // Created by beyond on 14-8-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // 继承自导航控制器,但是多了一个功能,可以监听手势,进行动画切换 #import <UIKit/UIKit.h> @interface

iOS_20_微博新特性页面

最终效果图: BeyondAppDelegate.m // // BeyondAppDelegate.m // 20_帅哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondAppDelegate.h" #import "BeyondViewController.h" #import &quo

iOS_20_微博骨架搭建

最终效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // 这个就是主控制器,分为两块,下面是Dock栏,上面是显示不同的子控制器的view,子控制器最好用导航控制器包装一下,这样子控制器就自带了导航条,左按钮,标题,右按钮 /

iOS_20_微博『更多』页面

最终效果图: MoreViewController.m // // MoreViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-4. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "MoreViewController.h" @interface MoreViewController () { // more.plist根是字典

Mac App 最好的快速启动及切换工具:Manico 2.0

本文标签: Mac效率工具 Mac小工具 Manico2.0 MacApp快速启动 MacApp切换工具 在 OS X 下,我们想要启动或切换应用时,通常有以下三个选择: 对于常用应用,将鼠标光标移动到屏幕下方打开 Dock 栏,从中选择需要启动或切换的应用打开: 对于已经启动的应用,按下「CMD + Tab」呼出切换器,按 Tab 键或使用鼠标选择需要切换的应用打开: 对于既没有放在 Dock 栏也没有启动的应用,可以通过 Launchpad 或 Spotlight 搜索应用打开. 对于习惯使

iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付

产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK SDK下载 设置URL Scheme,用于从第三方应用或浏览器中启动app 将SDK添加到工程中(支持CocoaPods),app启动时(didFinishLaunchingWithOptions)注册appkey 重写AppDelegate 的handleOpenURL和openURL方法,其它引用

李炎恢PHP第4季视频教程 微博项目实战

--------------------课程目录--------------------01.ThinkPHP--为什么要学习框架[1].avi02.ThinkPHP--安装与配置[2].avi03.ThinkPHP--模块化和URL模式[3].avi04.ThinkPHP--模型初步[上][4].avi05.ThinkPHP--模型初步[下][5].avi06.ThinkPHP--SQL查询语句[上][6].avi07.ThinkPHP--SQL查询语句[下][7].avi08.ThinkPH

Web前端开发推荐阅读书籍、学习课程下载

转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学习和跟着有经验的同事学习,读书也是必不可少的.书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高. 而如果深一脚浅一脚的学习,写出代码的质量会参差不齐.初学者的首要任务是成为靠谱的熟练开发者,能够稳定的输出有一定质量的代码. 前端技术发展速度特别快,总是涌现出很多新的东西,需要不断的学习