媒介
年夜家都曉得完成狀況欄(statusBar)點擊主動回到頂部後果,旨在為用戶在閱讀界面時供給方便,點擊狀況欄可以或許疾速回到界面頂部,所以重要針對可以轉動的UIScrollView
和其子類UITableVIew
和UICollectionView
。
這裡將從以下幾個方面完成該功效。
1.蘋果自帶功效
剖析:
起首,蘋果本身曾經供給了該功效,往上滑動tabView
,點擊statusBar
,tableView
會主動回到初始地位。以下圖所示,此時點擊statusBar
,屏幕最上方顯示的將是第一個cell
。在一個掌握器上添加一個tabView
,那末默許點擊statusBar
是可以主動回到頂部的。
既然蘋果曾經供給了該功效,我們直接拿來用就行了,干嗎還要本身完成呢?
其實否則,在一些情形下該功效是有效的。好比,在窗口上同時存在兩個或兩個以上UIScrollView
或其子類時。例如,將下面的tabView
先添加到一個scrollView
上,然後再將該scrollView
添加到掌握器的View
上,此時點擊statusBar
,tabView不克不及主動回到頂部。
由於,該後果能否有用,與 scrollsToTop
屬性相干。檢查官方文檔,以下幾點值得留意:
1.默許情形下scrollsToTop
是為YES的,只要當該屬性為YES時,點擊statusBar
才有用。
2.該後果是讓間隔statusBar
比來的ScrollView
主動回到頂部
3.在iPhone屏幕上方,當存在多個ScrollView
(或其子類),假如scrollsToTop= YES
的ScrollView
跨越一個,一切ScrollView
都不會呼應statusBar
的點擊。
小結:
從下面剖析我們可以得出結論:我們必需包管窗口上scrollsToTop == YES
的ScrollView
(及其子類)統一時光內有且只要一個。這一樣能力包管點擊statusBar,該獨一存在的ScrollView
能主動回到頂部。
若何包管蘋果自帶的該功效一向好使呢?
處理方法:我們願望回到頂部的ScrollView
的scrollsToTop =YES
,其他scrollsToTop = NO
。
有時,為了知足某種需求,我們在一個scrollView
下面會添加多個TabView
,完成高低滑動顯示cell
的分歧內容,閣下滑動可以切換分歧的tabView
,這時候點擊statusBar
是沒有用果的。由於一切的scrollView
的scrollsToTop =YES
。要想展現每一個TableView
時,點擊statusBar
都有用,必需讓除展現在最下面的TabView
之外的一切的ScrollView
的scrollsToTop =NO
。這就須要去斷定,究竟顯示的是哪個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沒有被創立,跳過 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.本身完成
在statusBar
的區域添加一個隱瞞,監聽隱瞞的點擊事宜。
UIView
起首我們想到用UIView
來做這個隱瞞。然則,在這裡我們應用UIView
是著不住statusBar
的,UIView
會一向在statusBar
的上面,所以不克不及吸收點擊事宜。由於statusBar
實際上是一個UIWindow
,且優先級高於上面的keyWindow
。所以,添加的UIView
會在statusBar
的上面。
UIWindow
因為優先級的關系,我們可以用一個UIWindow
來做隱瞞,設置隱瞞window
的優先級高於statusBar
便可。固然,設置最高優先級(UIWindowLevelAlert
)確定是可以的。然後給隱瞞Window
添加一個點擊事宜,配景色設置通明便可。
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; //添加手勢 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中直接監聽statusBar的點擊
在AppDelegate
中完成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); }]; }
總結
以上就是這篇文章的全體內容,願望對年夜家開辟IOS能有所贊助,假如有疑問年夜家可以留言交換,感謝年夜家對本站的支撐。
【iOS完成點擊狀況欄主動回到頂部後果詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!