1 UIStatusBar的系统点击事件

系统默认的点击状态栏时,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的内容都会返回到顶部,用户体验不好
网友评论