SloppySwiper 對(duì)于Tabbar的不友好修改

最近想把以前一個(gè)項(xiàng)目的側(cè)滑返回?fù)Q成為全屏側(cè)滑有效,而不僅僅是邊界側(cè)滑。

之前一直使用系統(tǒng)提供的方案疫诽,使之實(shí)現(xiàn)邊界側(cè)滑返回。一直使用都沒什么問題笼恰,也算比較好用踊沸。但是如果在大屏幕手機(jī)上,邊界側(cè)滑返回對(duì)于手小的人來(lái)說依然是不方便的社证,以此為基礎(chǔ)我需要找一個(gè)第三方庫(kù)以支持全屏幕任何位置右滑動(dòng)返回上個(gè)界面逼龟。而我的就項(xiàng)目是用了UITabBarController的,需求是UITabBarController的子視圖控制器需要有tabBar追葡,以后它push出來(lái)的界面不需要tabbar腺律。這個(gè)時(shí)候SloppySwiper會(huì)出現(xiàn)tabbar還原位置失誤的問題。如圖:

問題和最終解決后的結(jié)果宜肉。


SloppySwiper 對(duì)于Tabbar的不友好修改

SloppySwiper 對(duì)于Tabbar的不友好修改修改后效果


這個(gè)問題是什么造成的呢匀钧?首先來(lái)看一張圖:

這張圖是我拷貝來(lái)的,但是它很清晰的介紹了UINavigationController谬返,UIViewController 和UITabBarController的關(guān)系之斯。這也是我們搭建這種有tabbar和navigationBar界面的實(shí)際邏輯順序∏猜粒【【【UIViewController】UINavigationController】UITabBarController】:UIViewController 加在 UINavigationController上佑刷,UINavigationController加在UITabBarController。

而SloppySwiper庫(kù)的側(cè)滑返回時(shí)對(duì)于tabbar的處理是將tabbar從原來(lái)的UITabBarController上拿出來(lái)添加到toViewController上酿炸,造成一種然后動(dòng)畫效果完成后再將tabbar放回到UITabBarController上瘫絮。也就是說其實(shí)是一個(gè)障眼法的法子來(lái)實(shí)現(xiàn)tabbar的隱藏和出現(xiàn)。

但是有tabbar的時(shí)候toViewController.view.frame.size.height 是等于【屏幕高度】-【navigationBar高度】-【狀態(tài)欄高度】-【tabbar高度】(6s模擬器下是554)


而返回再添加到UITabBarController的tabar高度y坐標(biāo)就變了填硕,變成了505 =【toViewController.view高度】-【tabbar高度】麦萤。


這個(gè)讓我發(fā)現(xiàn)了問題所在鹿鳖,原來(lái)tabbar最后沒有落在屏幕最下方的位置可能是【toViewController.view高度】造成的。但是這個(gè)猜想到底是否正確呢壮莹?

我們做個(gè)試驗(yàn):我們每次都將要push的時(shí)候?qū)?dāng)前ViewController.view的高度做一個(gè)調(diào)整翅帜,變成【ViewController高度】= 【屏幕高度】-【navigationBar高度】-【狀態(tài)欄高度】,也就是把tabbar占用的【tabbar高度】加上去垛孔。

每次pop快要結(jié)束的時(shí)候?qū)⒁氐降腣iewController.view的高度調(diào)整回來(lái)藕甩,變成【ViewController高度】= 【屏幕高度】-【navigationBar高度】-【狀態(tài)欄高度】-【tabbar高度】,這樣將tabbar占用的【tabbar高度】減去周荐。

這樣做的目的就是為了保證每次push的時(shí)候不管當(dāng)前有沒有tabbar都保證ViewControlle.viewr的高度為沒有tabbar情況下的大小狭莱。這樣保證效果一致。

那么怎么做到push和pop的時(shí)候進(jìn)行ViewController.view高度修改呢概作?我想到了viewWillDisappear和viewDidAppear兩個(gè)方法腋妙,每次界面push的時(shí)候會(huì)調(diào)用viewWillDisappear,每次pop回來(lái)的時(shí)候會(huì)執(zhí)行viewDidAppear讯榕。

當(dāng)然最終結(jié)果是可行的骤素。也達(dá)到了我想要的效果。

執(zhí)行方式如下:

// [self viewWillPush];[self viewWillPopBack];是對(duì)界面內(nèi)其他收到影響的view做調(diào)整愚屁,當(dāng)然也可以用通知等等其他的方法改济竹,我這里就隨意寫一下。

- (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];

}

}

最后介紹一下系統(tǒng)的邊界右滑返回是實(shí)現(xiàn)霎槐。

我習(xí)慣在公用父類里寫通用方法送浊,這里的代碼放在繼承了UIControllerView的ModelViewController里。以后的viewController都繼承ModelViewController丘跌。

使用方法:在UITabBarController的所有子viewcontroller里都實(shí)現(xiàn)[self moveFingerToBack];方法即可袭景。

代碼:

#pragma mark 側(cè)滑返回 非根節(jié)點(diǎn)的viewcontroller 不許使用

-(void)moveFingerToBack{

self.navigationController.interactivePopGestureRecognizer.enabled = YES;

self.navigationController.interactivePopGestureRecognizer.delegate = self;

}

#pragma mark interactivePopGestureRecognizer 代理

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

// 注意:只有非根控制器才有滑動(dòng)返回功能,根控制器沒有闭树。

// 判斷導(dǎo)航控制器是否只有一個(gè)子控制器耸棒,如果只有一個(gè)子控制器,肯定是根控制器

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

// 表示用戶在根控制器界面报辱,就不需要觸發(fā)滑動(dòng)手勢(shì)与殃,

return NO;

}

return YES;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碍现,隨后出現(xiàn)的幾起案子幅疼,更是在濱河造成了極大的恐慌,老刑警劉巖鸵赫,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衣屏,死亡現(xiàn)場(chǎng)離奇詭異躏升,居然都是意外死亡辩棒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)一睁,“玉大人钻弄,你說我怎么就攤上這事≌哂酰” “怎么了窘俺?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)复凳。 經(jīng)常有香客問我瘤泪,道長(zhǎng),這世上最難降的妖魔是什么育八? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任对途,我火速辦了婚禮,結(jié)果婚禮上髓棋,老公的妹妹穿的比我還像新娘实檀。我一直安慰自己,他們只是感情好按声,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布膳犹。 她就那樣靜靜地躺著,像睡著了一般签则。 火紅的嫁衣襯著肌膚如雪须床。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天怀愧,我揣著相機(jī)與錄音侨颈,去河邊找鬼。 笑死芯义,一個(gè)胖子當(dāng)著我的面吹牛哈垢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扛拨,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼耘分,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绑警?” 一聲冷哼從身側(cè)響起求泰,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎计盒,沒想到半個(gè)月后渴频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡北启,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年卜朗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拔第。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡场钉,死狀恐怖蚊俺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逛万,我是刑警寧澤泳猬,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站宇植,受9級(jí)特大地震影響得封,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜指郁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一呛每、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坡氯,春花似錦晨横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悯恍,卻和暖如春库糠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涮毫。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瞬欧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罢防。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓艘虎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咒吐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子野建,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1恬叹,想要解決就用__block...
    炙冰閱讀 2,492評(píng)論 1 14
  • 不同光線拍照效果
    顧小軸閱讀 176評(píng)論 0 0
  • 2017年9月19日 周二 晴 今天的日子真好候生,9月19日,長(zhǎng)長(zhǎng)久久绽昼,圓圓滿滿唯鸭,注定今天會(huì)是個(gè)特殊的日子! ...
    李墨兒媽媽閱讀 225評(píng)論 0 0
  • 似乎今夜唠粥,月亮異常的安靜 朦朦朧朧,那么低調(diào) 你可知否?月微涼 是一種靜美 月色如一縷輕煙,飄過心房 我倚欄望遠(yuǎn)方...
    離岸的船閱讀 360評(píng)論 0 3