iOS實現點擊狀態列自動回到頂部效果詳解_IOS

來源:互聯網
上載者:User

前言

大家都知道實現狀態列(statusBar)點擊自動回到頂部效果,旨在為使用者在瀏覽介面時提供便利,點擊狀態列能夠快速回到介面頂部,所以主要針對可以滾動的UIScrollView和其子類UITableVIewUICollectionView

這裡將從以下幾個方面實現該功能。

1.蘋果內建功能

分析:

首先,蘋果自己已經提供了該功能,往上滑動tabView,點擊statusBartableView會自動回到初始位置。如下圖所示,此時點擊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 == YESScrollView(及其子類)同一時間內有且只有一個。這一樣才能保證點擊statusBar,該唯一存在的ScrollView能自動回到頂部。

如何保證蘋果內建的該功能一直好使呢?

解決辦法:我們希望回到頂部的ScrollViewscrollsToTop =YES,其他scrollsToTop = NO

有時,為了滿足某種需求,我們在一個scrollView上面會添加多個TabView,實現上下滑動顯示cell的不同內容,左右滑動可以切換不同的tabView,這時點擊statusBar是沒有效果的。因為所有的scrollViewscrollsToTop =YES。要想展示每個TableView時,點擊statusBar都有效,必須讓除了展示在最上面的TabView以外的所有的ScrollViewscrollsToTop =NO。這就需要去判斷,到底顯示的是哪一個TabView

參考代碼如下:

1.讓最下面的scrollViewscrollsToTop =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];}

接收通知,修改tabViewcontentOffset

- (void)coverWindowClick { [UIView animateWithDuration:0.5 animations:^{  self.tableView.contentOffset = CGPointMake(0, 0); }];}

總結

以上就是這篇文章的全部內容,希望對大家開發IOS能有所協助,如果有疑問大家可以留言交流,謝謝大家對雲棲社區的支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.