媒介
年夜家都曉得完成狀況欄(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完成點擊狀況欄主動回到頂部後果詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!