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

要求:

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

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

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



HomeVC.m

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

如上图所看到的,

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

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

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

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

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

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

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

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

在以下的willShowViewController方法中,

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

导航控制器的代理方法     willShowViewController

  1. #pragma mark - 导航控制器的代理方法
  2. // 屏幕宽 320
  3. #define kWinWidth self.view.bounds.width
  4. // 屏幕高 480
  5. #define kWinHeight self.view.bounds.height
  6. // 顶部状态条 20
  7. #define kStatusBarHeight 20
  8.  
  9. // 目的是,监听push动作,在新控制器将进入栈顶时,设置左边button为返回箭头,设置右边button为回到首页
  10. - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
  11. {
  12. //重要~~~~
  13. // 先取得根控制器
  14. UIViewController *rootVC = navigationController.viewControllers[0];
  15.  
  16. // 假设将要显示的控制器(将被push入栈的), 不是栈底控制器(根控制器)。才须要设置左边为返回button,右边为首页button
  17. if (viewController != rootVC) {
  18.  
  19. // 左边的返回到上一个控制器
  20. viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithBgIcon:@"navigationbar_back.png" target:self action:@selector(popToPreviousVC)];
  21.  
  22. // 右边的回到首页button,即回到栈底控制器(即从详情页回到列表页)
  23. viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithBgIcon:@"navigationbar_home.png" target:self action:@selector(backToRootVC)];
  24.  
  25. // 1,先拉长导航控制器的view的高度 为整个窗体的高度-20 (由于dock消失后,底部会多空出黑色的空间)
  26. navigationController.view.frame = CGRectMake(0, 20,320,480 - 20);
  27.  
  28. // 2,先让Dock从主控制器(BeyondViewController)的view上移除
  29. [_dock removeFromSuperview];
  30.  
  31. // 3,为了在Push下一个控制器,让dock和根控制器一起平移,所以,加入dock到导航控制器的根控制器的view上 ,并又一次调整Dock在HomeVC的view中的Y值就可以,注意导航不会移动,移的是导航的根控制器,而根控制器的原点(0 0)是 :20+导航栏高度44
  32.  
  33. // 假设根控制器是能够滚动的,则要注意y的原点是在tableView的顶部(当向下滚了一定的距离之后)
  34. if ([rootVC.view isKindOfClass:[UIScrollView class]]) {
  35. UIScrollView * scrollV = (UIScrollView *)rootVC.view;
  36. // dock的导航控制器的根控制器里面的y值
  37. // 由于滚动之后,rootView的左上角到顶上非常远的地方了
  38. _dock.frame =CGRectMake(0, scrollV.contentOffset.y + 460 - kDockHeight, 320, kDockHeight );
  39. } else {
  40. // dock的导航控制器的根控制器里面的y值
  41. _dock.frame =CGRectMake(0, 480 - 20 - 2*kDockHeight, 320, kDockHeight );
  42.  
  43. }
  44. // 4,最后再加入dock到导航控制器的根控制器里面(rootVC界面上(即导航控制器的根控制器),目的是push新的VC的时候,让dock和导航控制器的根控制器一起平移到界面的左边去,当点击返回键的时候,dock又能和rootVC一起回来
  45. [rootVC.view addSubview:_dock];
  46.  
  47. }
  48. }

在以下的didShowViewController方法中,

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

导航控制器的代理方法    didShowViewController

  1. // 导航控制器的Y = 20,导航控制器的高度 = 总高度 - DOCK高度 - 20
  2. #define kContentFrame CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - kDockHeight - 20)
  3.  
  4. // BeyondVC主控制器中,DOCK的Y = 总高度 - DOCK高度
  5. #define KDockFrame CGRectMake(0, self.view.frame.size.height - kDockHeight, self.view.frame.size.width, kDockHeight)
  6.  
  7. // 目的是,监听push动作,在新控制器已经显示的时候,将dock从导航控制器中移除,再又又一次显示到主控制器
  8. - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
  9. {
  10. // 先取得导航 的栈底的根控制器
  11. UIViewController *rootVC = navigationController.viewControllers[0];
  12. // 假设要显示的控制器是根控制器,又一次把Dock
  13. if (viewController == rootVC) {
  14. // 更改导航控制器view的frame
  15. // 导航控制器的Y = 20,导航控制器的高度 = 总高度 - DOCK高度 - 20
  16. navigationController.view.frame = kContentFrame;
  17.  
  18. // 将Dock先从栈底的根控制器rootVC上移除
  19. [_dock removeFromSuperview];
  20.  
  21. // 再加入dock到BeyondViewController,DOCK的Y = 总高度 - DOCK高度
  22. _dock.frame = KDockFrame;
  23. [self.view addSubview:_dock];
  24. }
  25. }

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

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

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

    终于效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/ ...

  2. iOS_20_微博的骨架结构

    最后效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 1 ...

  3. iOS_20_微博OAuth授权_取得用户授权的accessToken

    终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...

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

    产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...

  5. macbook 快捷键

    macbook  air快捷键应用 Command + 空格键  = 切换输入法Command + Control + F = 全屏(Command + Shift + F Chrome全屏 Comm ...

  6. 读书笔记-Coding faster(英文版)

    读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...

  7. MacBook 经常使用快捷键

    Mac OS X系统图形表示方法 ⇧ = shift ⌃ = control ⌥ = option / alt  Home=fn + ◄  End=fn + ►  Page Up=fn + ▲ Pag ...

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

    转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学 ...

  9. 浏览器调试的必知必会,零基础足够详细-第一节console面板、移动端调试

    前言 本文已经发布视频点击查看 开发过程中,浏览器的调试非常重要,可以说是必备的技巧,本文我就会分享一些自己掌握的技巧,欢迎补充 我们默认使用Chrome浏览器,但是你使用新edge浏览器也是可以的 ...

随机推荐

  1. Android 的一些提示框

    1.在测试时,如何实现一个提示 可以使用 Toast.makeText(this, "这是一个提示", Toast.LENGTH_SHORT).show(); //从资源文件str ...

  2. Java实现根据输入的日期以及天数,获取此日期之后的天数的工作日

    public static void main(String[] args) { List<String> list = new ArrayList<String>();//节 ...

  3. CSS实现水平垂直居中方式

    1.定位 核心代码实现请看示例代码中的注释: <!DOCTYPE html> <html lang="zh"> <head> <meta ...

  4. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  5. tensorflow serving 打印调试log

    启动时添加环境变量 export TF_CPP_MIN_VLOG_LEVEL=1 ,这样可以打印VLOG(1)的log

  6. glusterFS分布式存储部署流程

    转自:http://bangbangba.blog.51cto.com/3180873/1712061 GlusterFS是一款非常易于使用的分布式文件存储系统,实现了全部标准POSIX接口,并用fu ...

  7. 通过Java发送邮件和接收邮件的工具类

    一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...

  8. MySQL Workbench--Window安装试用

    MySQL Workbench 01.概述 MySQL Workbench provides DBAs and developers an integrated tools environment f ...

  9. 速度挑战 - 2小时完成HTML5拼图小游戏

    概述 我用lufylegend.js开发了第一个HTML5小游戏——拼图游戏,还写了篇博文来炫耀一下:HTML5小游戏<智力大拼图>发布,挑战你的思维风暴. 详细 代码下载:http:// ...

  10. Android学习之Menu

    1.普通的Menu 在Activity中覆盖onCreateOptionsMenu(Menu menu)方法,该方法负责生产menu,它是一个回调函数,即当按下手机设备上的menubutton时And ...