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尾随导航控制器的根控制器,一起消失,又一起回来~
iOS_20_微博Dock的尾随切换的更多相关文章
- iOS_20_微博自己定义可动画切换的导航控制器
终于效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/ ...
- iOS_20_微博的骨架结构
最后效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 1 ...
- iOS_20_微博OAuth授权_取得用户授权的accessToken
终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...
- iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付
产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...
- macbook 快捷键
macbook air快捷键应用 Command + 空格键 = 切换输入法Command + Control + F = 全屏(Command + Shift + F Chrome全屏 Comm ...
- 读书笔记-Coding faster(英文版)
读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...
- MacBook 经常使用快捷键
Mac OS X系统图形表示方法 ⇧ = shift ⌃ = control ⌥ = option / alt Home=fn + ◄ End=fn + ► Page Up=fn + ▲ Pag ...
- Web前端开发推荐阅读书籍、学习课程下载
转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学 ...
- 浏览器调试的必知必会,零基础足够详细-第一节console面板、移动端调试
前言 本文已经发布视频点击查看 开发过程中,浏览器的调试非常重要,可以说是必备的技巧,本文我就会分享一些自己掌握的技巧,欢迎补充 我们默认使用Chrome浏览器,但是你使用新edge浏览器也是可以的 ...
随机推荐
- wepy - 与原生有什么不同(单文件模式)
小程序采用同文件夹(文件名),统一通过app.json来管理 而vue以及wepy采用的是单文件模式(js.html.css)合并在一起了! wepy单文件模式 <style> .ok{ ...
- 在线sass编译器
工作中,我们可能遇到突发情况(无法安装考拉,gulp以及webpack以及其它的自动化工具),我们这时就要用即时编译工具了,那么它就是你的首选: http://tool.oschina.net/
- 理解SVG的图形填充规则
SVG的图形填充规则通过fill-rule属性来指定. 有效值: nonzero | evenodd | inherit 默认值: nonzero fill-rule属性用于指定使用哪一种算法 ...
- Google 做过的 12 件奇葩事
Google做了太多伟大的事情了.以至于有时它有点让人难以实时跟上它的动态.假设你对这家公司略微有点感情.看看他们做过的一些有点匪夷所思的事儿,可能认为,毕竟是大公司.还挺难以被全然理解透的. 一个Q ...
- 使用 Feed43
1.打开 Feed43 2.将标题.链接,时间等变化的字段删去用 {%} 代替.将固定且多余的字段删去用 {*} 代替.注意,源码中有换行的地方均需要添加{*} . 3.活学活用
- Web Service基础——基础概念
1. Web Service基本概念 Web Service(Web服务)是一种远程调用技术,他的作用就是从远程系统中获取业务数据.具体来说,Web Service可以让你的网站使用其他网站的资源,比 ...
- Mint17 一些安装备忘
1,中文输入法: sudo apt-add-repository ppa:fcitx-team/dailybuild-fcitx-master sudo apt-get update sudo apt ...
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...
- printDocument设置适应边框打印 特重要 找了半天 设置一个属性即可
private void pd_PrintPage(object sender, PrintPageEventArgs e) { e.Graphics.SmoothingMode = System.D ...
- Response.Flush() Response.End()的区别
//Response.Flush() 将缓存中的内容立即显示出来//Response.End() 缓冲的输出发送到客户端 停止页面执行//例://Response.Write("520& ...