iOS實(shí)現(xiàn)點(diǎn)擊狀態(tài)欄自動(dòng)回到頂部效果詳解
前言
大家都知道實(shí)現(xiàn)狀態(tài)欄(statusBar)點(diǎn)擊自動(dòng)回到頂部效果,旨在為用戶在瀏覽界面時(shí)提供便利,點(diǎn)擊狀態(tài)欄能夠快速回到界面頂部,所以主要針對(duì)可以滾動(dòng)的UIScrollView和其子類UITableVIew和UICollectionView。
這里將從以下幾個(gè)方面實(shí)現(xiàn)該功能。
1.蘋果自帶功能
分析:
首先,蘋果自己已經(jīng)提供了該功能,往上滑動(dòng)tabView,點(diǎn)擊statusBar,tableView會(huì)自動(dòng)回到初始位置。如下圖所示,此時(shí)點(diǎn)擊statusBar,屏幕最上方顯示的將是第一個(gè)cell。在一個(gè)控制器上添加一個(gè)tabView,那么默認(rèn)點(diǎn)擊statusBar是可以自動(dòng)回到頂部的。

既然蘋果已經(jīng)提供了該功能,我們直接拿來用就好了,干嘛還要自己實(shí)現(xiàn)呢?
其實(shí)不然,在一些情況下該功能是無效的。比如,在窗口上同時(shí)存在兩個(gè)或兩個(gè)以上UIScrollView或其子類時(shí)。例如,將上面的tabView先添加到一個(gè)scrollView上,然后再將該scrollView添加到控制器的View上,此時(shí)點(diǎn)擊statusBar,tabView不能自動(dòng)回到頂部。
因?yàn)椋撔Ч欠裼行?,與 scrollsToTop屬性相關(guān)。查看官方文檔,以下幾點(diǎn)值得注意:
1.默認(rèn)情況下scrollsToTop是為YES的,只有當(dāng)該屬性為YES時(shí),點(diǎn)擊statusBar才有效。
2.該效果是讓距離statusBar最近的ScrollView自動(dòng)回到頂部
3.在iPhone屏幕上方,當(dāng)存在多個(gè)ScrollView(或其子類),如果scrollsToTop= YES 的ScrollView超過一個(gè),所有ScrollView都不會(huì)響應(yīng)statusBar的點(diǎn)擊。
小結(jié):
從上面分析我們可以得出結(jié)論:我們必須保證窗口上scrollsToTop == YES的ScrollView(及其子類)同一時(shí)間內(nèi)有且只有一個(gè)。這一樣才能保證點(diǎn)擊statusBar,該唯一存在的ScrollView能自動(dòng)回到頂部。
如何保證蘋果自帶的該功能一直好使呢?
解決辦法:我們希望回到頂部的ScrollView的scrollsToTop =YES,其他scrollsToTop = NO。
有時(shí),為了滿足某種需求,我們?cè)谝粋€(gè)scrollView上面會(huì)添加多個(gè)TabView,實(shí)現(xiàn)上下滑動(dòng)顯示cell的不同內(nèi)容,左右滑動(dòng)可以切換不同的tabView,這時(shí)點(diǎn)擊statusBar是沒有效果的。因?yàn)樗械?code>scrollView的scrollsToTop =YES。要想展示每個(gè)TableView時(shí),點(diǎn)擊statusBar都有效,必須讓除了展示在最上面的TabView以外的所有的ScrollView的scrollsToTop =NO。這就需要去判斷,到底顯示的是哪一個(gè)TabView。
參考代碼如下:
1.讓最下面的scrollView,scrollsToTop =NO。其他TableView都是該scrollView的子類。
2.遍歷判斷
// 控制scrollView的scrollsToTop屬性
for (NSInteger i = 0; i < self.childViewControllers.count; i++) {
UIViewController *childVc = self.childViewControllers[i];
// 如果控制器的view沒有被創(chuàng)建,跳過
if (!childVc.isViewLoaded) continue;
// 如果控制器的view不是scrollView,就跳過
if (![childVc.view isKindOfClass:[UIScrollView class]]) continue;
// 如果控制器的view是scrollView
UIScrollView *scrollView = (UIScrollView *)childVc.view;
scrollView.scrollsToTop = (i == index);
}
2.自己實(shí)現(xiàn)
在statusBar的區(qū)域添加一個(gè)遮蓋,監(jiān)聽遮蓋的點(diǎn)擊事件。
UIView
首先我們想到用UIView來做這個(gè)遮蓋。但是,在這里我們使用UIView是著不住statusBar的,UIView會(huì)一直在statusBar的下面,所以不能接收點(diǎn)擊事件。因?yàn)?code>statusBar其實(shí)是一個(gè)UIWindow,且優(yōu)先級(jí)高于下面的keyWindow。所以,添加的UIView會(huì)在statusBar的下面。

UIWindow
由于優(yōu)先級(jí)的關(guān)系,我們可以用一個(gè)UIWindow來做遮蓋,設(shè)置遮蓋window的優(yōu)先級(jí)高于statusBar即可。當(dāng)然,設(shè)置最高優(yōu)先級(jí)(UIWindowLevelAlert)肯定是可以的。然后給遮蓋Window添加一個(gè)點(diǎn)擊事件,背景色設(shè)置透明即可。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIWindow * coverWindow =[[UIWindow alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
self.coverWindow = coverWindow;
coverWindow.hidden = NO;
coverWindow.backgroundColor = [UIColor redColor];
coverWindow.windowLevel = UIWindowLevelAlert;
//添加手勢(shì)
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(coverWindowClick)];
[self.coverWindow addGestureRecognizer:tap];
});
- (void)coverWindowClick {
[UIView animateWithDuration:0.5 animations:^{
self.tableView.contentOffset = CGPointMake(0, 0);
}];
}
AppDelegate中直接監(jiān)聽statusBar的點(diǎn)擊
在AppDelegate中實(shí)現(xiàn)touchesBegan:方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
if ([touches.anyObject locationInView:nil].y > 20) return;
[[NSNotificationCenter defaultCenter]postNotificationName:@"click" object:nil];
}
接收通知,修改tabView的contentOffset
- (void)coverWindowClick {
[UIView animateWithDuration:0.5 animations:^{
self.tableView.contentOffset = CGPointMake(0, 0);
}];
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望對(duì)大家開發(fā)IOS能有所幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
IOS 開發(fā)之ios視頻截屏的實(shí)現(xiàn)代碼
這篇文章主要介紹了IOS 開發(fā)之ios視頻截屏的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-07-07
iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解
這篇文章主要為大家介紹了iOS開發(fā)技能weak和strong修飾符的規(guī)范使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
iOS實(shí)現(xiàn)可以縱向橫向滑動(dòng)的表格實(shí)例代碼
這篇文章主要給大家介紹了利用iOS實(shí)現(xiàn)可以縱向橫向滑動(dòng)的表格的相關(guān)資料,文中給出了詳細(xì)的實(shí)現(xiàn)方法示例代碼,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
iOS中創(chuàng)建Model的最佳實(shí)踐記錄
這篇文章主要給大家介紹了關(guān)于iOS中創(chuàng)建Model的最佳實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
iOS開發(fā)之UIPickerView實(shí)現(xiàn)城市選擇器的步驟詳解
這篇文章給大家介紹iOS利用控件UIPickerView實(shí)現(xiàn)城市選擇器的效果,選擇城市這一功能相信在大家日常開發(fā)的時(shí)候經(jīng)常遇見,下面就來看看詳細(xì)的實(shí)現(xiàn)過程,有需要的可以參考借鑒。2016-09-09
iOS無障礙適配西瓜視頻Voice?Over實(shí)踐示例
本文從研發(fā)的視角出發(fā),講述了如何使用?Voice?Over、如何適配?Voice?Over?以及適配過程中如果遇到問題應(yīng)該如何解決。希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

