SloppySwiper 对于Tabbar的不友好修改

最近想把以前一个项目的侧滑返回换成为全屏侧滑有效,而不仅仅是边界侧滑。

之前一直使用系统提供的方案,使之实现边界侧滑返回。一直使用都没什么问题,也算比较好用。但是如果在大屏幕手机上,边界侧滑返回对于手小的人来说依然是不方便的,以此为基础我需要找一个第三方库以支持全屏幕任何位置右滑动返回上个界面。而我的就项目是用了UITabBarController的,需求是UITabBarController的子视图控制器需要有tabBar,以后它push出来的界面不需要tabbar。这个时候SloppySwiper会出现tabbar还原位置失误的问题。如图:

问题和最终解决后的结果。


SloppySwiper 对于Tabbar的不友好修改

SloppySwiper 对于Tabbar的不友好修改修改后效果


这个问题是什么造成的呢?首先来看一张图:

这张图是我拷贝来的,但是它很清晰的介绍了UINavigationController,UIViewController 和UITabBarController的关系。这也是我们搭建这种有tabbar和navigationBar界面的实际逻辑顺序。【【【UIViewController】UINavigationController】UITabBarController】:UIViewController 加在 UINavigationController上,UINavigationController加在UITabBarController。

而SloppySwiper库的侧滑返回时对于tabbar的处理是将tabbar从原来的UITabBarController上拿出来添加到toViewController上,造成一种然后动画效果完成后再将tabbar放回到UITabBarController上。也就是说其实是一个障眼法的法子来实现tabbar的隐藏和出现。

但是有tabbar的时候toViewController.view.frame.size.height 是等于【屏幕高度】-【navigationBar高度】-【状态栏高度】-【tabbar高度】(6s模拟器下是554)


而返回再添加到UITabBarController的tabar高度y坐标就变了,变成了505 =【toViewController.view高度】-【tabbar高度】。


这个让我发现了问题所在,原来tabbar最后没有落在屏幕最下方的位置可能是【toViewController.view高度】造成的。但是这个猜想到底是否正确呢?

我们做个试验:我们每次都将要push的时候将当前ViewController.view的高度做一个调整,变成【ViewController高度】= 【屏幕高度】-【navigationBar高度】-【状态栏高度】,也就是把tabbar占用的【tabbar高度】加上去。

每次pop快要结束的时候将将要回到的ViewController.view的高度调整回来,变成【ViewController高度】= 【屏幕高度】-【navigationBar高度】-【状态栏高度】-【tabbar高度】,这样将tabbar占用的【tabbar高度】减去。

这样做的目的就是为了保证每次push的时候不管当前有没有tabbar都保证ViewControlle.viewr的高度为没有tabbar情况下的大小。这样保证效果一致。

那么怎么做到push和pop的时候进行ViewController.view高度修改呢?我想到了viewWillDisappear和viewDidAppear两个方法,每次界面push的时候会调用viewWillDisappear,每次pop回来的时候会执行viewDidAppear。

当然最终结果是可行的。也达到了我想要的效果。

执行方式如下:

// [self viewWillPush];[self viewWillPopBack];是对界面内其他收到影响的view做调整,当然也可以用通知等等其他的方法改,我这里就随意写一下。

- (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear:animated];

//    展示tabBar

UINavigationController *navController = self.navigationController;

BOOL isToViewControllerFirstInNavController = [navController.viewControllers firstObject] == self;

if(self.tabBarController && isToViewControllerFirstInNavController){

self.view.frame = CGRectMake(self.view.frame.origin.x,

self.view.frame.origin.y,

self.view.frame.size.width,

ScreenHeight - self.navigationController.navigationBar.frame.size.height - 20 - self.tabBarController.tabBar.frame.size.height);

[self viewWillPopBack];

}

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

UINavigationController *navController = self.navigationController;

BOOL isToViewControllerFirstInNavController = [navController.viewControllers firstObject] == self;

if (self.tabBarController && isToViewControllerFirstInNavController) {

self.view.frame = CGRectMake(self.view.frame.origin.x,

self.view.frame.origin.y,

self.view.frame.size.width,

ScreenHeight - self.navigationController.navigationBar.frame.size.height - 20);

[self viewWillPush];

}

}

最后介绍一下系统的边界右滑返回是实现。

我习惯在公用父类里写通用方法,这里的代码放在继承了UIControllerView的ModelViewController里。以后的viewController都继承ModelViewController。

使用方法:在UITabBarController的所有子viewcontroller里都实现[self moveFingerToBack];方法即可。

代码:

#pragma mark 侧滑返回 非根节点的viewcontroller 不许使用

-(void)moveFingerToBack{

self.navigationController.interactivePopGestureRecognizer.enabled = YES;

self.navigationController.interactivePopGestureRecognizer.delegate = self;

}

#pragma mark interactivePopGestureRecognizer 代理

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

// 注意:只有非根控制器才有滑动返回功能,根控制器没有。

// 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器

if (self.navigationController.childViewControllers.count == 1) {

// 表示用户在根控制器界面,就不需要触发滑动手势,

return NO;

}

return YES;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,480评论 1 14
  • 不同光线拍照效果
    顾小轴阅读 175评论 0 0
  • 2017年9月19日 周二 晴 今天的日子真好,9月19日,长长久久,圆圆满满,注定今天会是个特殊的日子! ...
    李墨儿妈妈阅读 223评论 0 0
  • 似乎今夜,月亮异常的安静 朦朦胧胧,那么低调 你可知否?月微凉 是一种静美 月色如一缕轻烟,飘过心房 我倚栏望远方...
    离岸的船阅读 353评论 0 3