1 UIStatusBar的系統點擊事件
9140338F-2789-434F-9867-79087E45A939.png
系統默認的點擊狀態欄時,scrollView的內容返回到頂部,如圖所示.原因是默認情況下scrollView 的scrollsToTop屬性為YES.
scrollsToTop的使用場景:當頁面中只有一個scrollView的scrollsToTop屬性為YES時,點擊狀態欄, scrollView的內容才會返回到頂部,如果像上圖頁面一樣,有多個scrollView(精華頁面,推薦,視頻,圖片等都是scrollView),且每個scrollView的scrollsToTop默認都為YES,點擊狀態欄是,scrollView的內容就不會滾動.為解決這個問題,實現方法有以下幾種:
2 恢復UIStatusBar的系統點擊
2.1 方法一:在UIStatusBar上覆蓋一個透明的UIWindow,并添加點擊事件
// 全局變量保存新建的窗口,否則是局部變量,程序啟動后會銷毀
static UIWindow *topWindow_;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 程序啟動完畢那一刻的所有窗口都必須要設置rootViewController,由于新建的 topWindow_ 沒有rootViewController ,所以延遲到程序啟動后執行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 創建一個新的窗口
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,將內容滾動到最前面
UIScrollView *scrollView = (UIScrollView *)view;
CGPoint offset = scrollView.contentOffset;
offset.y = - scrollView.contentInset.top;
[scrollView setContentOffset:offset animated:YES];
}
缺陷:
(1) 點擊狀態欄時,所有的scrollView的內容都會返回到頂部,用戶體驗不好