1 UIStatusBar的系統(tǒng)點(diǎn)擊事件
9140338F-2789-434F-9867-79087E45A939.png
系統(tǒng)默認(rèn)的點(diǎn)擊狀態(tài)欄時(shí),scrollView的內(nèi)容返回到頂部,如圖所示.原因是默認(rèn)情況下scrollView 的scrollsToTop屬性為YES.
scrollsToTop的使用場景:當(dāng)頁面中只有一個(gè)scrollView的scrollsToTop屬性為YES時(shí),點(diǎn)擊狀態(tài)欄, scrollView的內(nèi)容才會返回到頂部,如果像上圖頁面一樣,有多個(gè)scrollView(精華頁面,推薦,視頻,圖片等都是scrollView),且每個(gè)scrollView的scrollsToTop默認(rèn)都為YES,點(diǎn)擊狀態(tài)欄是,scrollView的內(nèi)容就不會滾動.為解決這個(gè)問題,實(shí)現(xiàn)方法有以下幾種:
2 恢復(fù)UIStatusBar的系統(tǒng)點(diǎn)擊
2.1 方法一:在UIStatusBar上覆蓋一個(gè)透明的UIWindow,并添加點(diǎn)擊事件
// 全局變量保存新建的窗口,否則是局部變量,程序啟動后會銷毀
static UIWindow *topWindow_;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 程序啟動完畢那一刻的所有窗口都必須要設(shè)置rootViewController,由于新建的 topWindow_ 沒有rootViewController ,所以延遲到程序啟動后執(zhí)行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 創(chuàng)建一個(gè)新的窗口
topWindow_ = [[UIWindow alloc] init];
topWindow_.windowLevel = UIWindowLevelAlert;
topWindow_.backgroundColor = [UIColor redColor];
topWindow_.frame = [UIApplication sharedApplication].statusBarFrame;
topWindow_.hidden = NO;
[topWindow_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
});
}
- (void)topWindowClick
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[self searchAllScrollViewsInView:window];
}
/**
* 查找view中的所有scrollView
*/
- (void)searchAllScrollViewsInView:(UIView *)view
{
// 遞歸遍歷所有的子控件
for (UIView *subview in view.subviews) {
[self searchAllScrollViewsInView:subview];
}
// 如果不是UIScrollView,直接返回
if (![view isKindOfClass:[UIScrollView class]]) return;
// 是scrollView,將內(nèi)容滾動到最前面
UIScrollView *scrollView = (UIScrollView *)view;
CGPoint offset = scrollView.contentOffset;
offset.y = - scrollView.contentInset.top;
[scrollView setContentOffset:offset animated:YES];
}
缺陷:
(1) 點(diǎn)擊狀態(tài)欄時(shí),所有的scrollView的內(nèi)容都會返回到頂部,用戶體驗(yàn)不好