iOS开发-点击状态栏scrollView回到顶部失效解决办法

若当前的ViewController中只有一个scrollView,点击状态栏,该scrollView就会滚动到顶部。但当ViewController中有多个scrollView时,就不灵了!这个时候,怎么去兼容呢?

UIScrollView有这么一个属性scrollsToTop。按住command,点击scrollsToTop进去你会看到关于这个属性的注解

On iPhone, we execute this gesture only if there‘s one on-screen scroll view with `scrollsToTop` == YES. If more than one is found, none will be scrolled.

现在知道为什么不灵了吧!!!

最近做项目,由于一个横屏的scrollView里面放置了多个tableView,但点击状态栏仍要求tableView滚动到顶部,所以要克服这个问题!

虽然"魏则西事件"让我们大家很鄙视百度,但在谷歌还进不来的情况下,我默默的百度了一下!

。。。。。。。。。。。。。。。。。。。。。。。。

问题解决后,我总结了一下。

思路是这样的:

1 追踪UIStatusBar的touch事件,然后响应该事件。不要直接向statusBar添加事件,因为并没有什么卵用!我也不知道为什么没有什么卵有!

2 找到UIApplication的keyWindow,遍历keyWindow的所有子控件。如果是scrollView,而且显示在当前keyWindow,那么将其contentOffset的y值设置为原始值(0)。这里会用到递归去进行遍历。

首先我们追踪UIStatusBar的触摸事件,需要在AppDelegate里面加入以下代码

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    CGPoint location = [[[event allTouches] anyObject] locationInView:self.window];
    CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
    if (CGRectContainsPoint(statusBarFrame, location)) {
        [self statusBarTouchedAction];
    }
}

然后在statusBarTouchedAction方法中将显示在当前keyWindow里面的scrollView滚动到顶部

- (void)statusBarTouchedAction {
    [JMSUIScrollViewTool scrollViewScrollToTop];
}

下面来看JMSUIScrollViewTool

#import <Foundation/Foundation.h>

@interface JMSUIScrollViewTool : NSObject

+ (void)scrollViewScrollToTop;

@end
#import "JMSUIScrollViewTool.h"

@implementation JMSUIScrollViewTool

+ (void)scrollViewScrollToTop {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self searchScrollViewInView:window];
}

+ (void)statusBarWindowClick {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self searchScrollViewInView:window];
}

+ (BOOL)isShowingOnKeyWindow:(UIView *)view {
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    CGRect newFrame = [keyWindow convertRect:view.frame fromView:view.superview];
    CGRect winBounds = keyWindow.bounds;
    BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
    return !view.isHidden && view.alpha > 0.01 && view.window == keyWindow && intersects;
}

+ (void)searchScrollViewInView:(UIView *)supView {
    for (UIScrollView *subView in supView.subviews) {
        if ([subView isKindOfClass:[UIScrollView class]] && [self isShowingOnKeyWindow:supView]) {
            CGPoint offset = subView.contentOffset;
            offset.y = -subView.contentInset.top;
            [subView setContentOffset:offset animated:YES];
        }

        [self searchScrollViewInView:subView];
    }
}

@end

接下来,就让你的项目跑起来吧!

此处应有掌声。。。

参考:http://stackoverflow.com/questions/3753097/how-to-detect-touches-in-status-bar

http://www.cocoachina.com/ios/20150807/12949.html

时间: 2024-10-12 19:33:18

iOS开发-点击状态栏scrollView回到顶部失效解决办法的相关文章

UITableView 或 UIScrollView 点击状态栏列表回到顶部

整理来自互联网- 这是tableView继承的scrollView的一个属性 scrollsToTop. 官方说明是这样的: // When the user taps the status bar, the scroll view beneath the touch which is closest to the status bar will be scrolled to top, but only if its `scrollsToTop` property is YES, its del

ios设置点击状态栏返回到顶部

在一个scrollview中横向有多个tableview,点击状态栏,tableview要返回到顶部要将所有scrollview 以及tableview 的scrollToTop设置为NO.显示的tableview的scrollToTop设置为TRUE. @property(nonatomic,strong) NSMutableArray *tdoclist; //设置一个数组,存储tableview self.tdoclist=[NSMutableArray arrayWithCapacity

关于tableView点击状态栏列表回到顶部的说明

怎么验证是否有开发经验? 这是tableView继承的scrollView的一个属性   scrollsToTop. 官方说明是这样的: // When the user taps the status bar, the scroll view beneath the touch which is closest to the status bar will be scrolled to top, but only if its `scrollsToTop` property is YES, i

IOS 开发 证书显示 此证书签发者无效 解决办法

系统证书WWDR在2016年2月14日失效,需要更新WWDR系统证书 下载证书地址https://developer.apple.com/certificationauthority/AppleWWDRCA.cer 下载之后 双击安装 到这  还需要一步 在登陆里面删除过期的证书 在系统里面 删除过期的证书 就可以完美的解决了.所有的证书 都可以使用了

iOS开发调用相机时出现黑屏的解决办法(原因:没有获取到相机权限)

在开发过程中调用系统相机,但是页面出现黑屏,原因是自己只进行了部分的相机权限的判断没有根据系统的版本判断, if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (authStatus == AVAutho

iOS UITableView中点击状态栏无法回滚到顶部

// When the user taps the status bar, the scroll view beneath the touch which is closest to the status bar will be scrolled to top, but only if its `scrollsToTop` property is YES, its delegate does not return NO from `shouldScrollViewScrollToTop`, an

iOS开发——实战技术OC篇&amp;点击状态栏ScrollView(包括子控件)自动滚到顶部

点击状态栏ScrollView(包括子控件)自动滚到顶部 其实这种方式我们平时见的还是比较多的,而且适合用户的需求,所以就搬来琢磨了一下,感觉效果还不错 这里就直接将解决思路一一写出来不将代码分段展示了,在代码中我加了详细的注释objective-c的套路和swift基本一样,在最后会将Swift和objective-c的代码一起放上,如果需要直接解决问题的童鞋可以直接将代码拷贝到工程里即可 首先创建一个topWindow继承至NSObject,这里我们考虑将这个功能完全封装起来,所以所有的方法

Android listview ,ScrollView 回到顶部的按钮

在有些listview上面和ScrollView上,当滑动到底部的时候,在右下角会出现一个回到顶部的按钮,提供更好的用户体验. 效果图如下: 布局 先说布局,可以用帧布局Framelayout,也可以用相对布局relativelayout.看下listview的布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem

ios-自定义点击状态栏滚回顶部

点击状态栏滚回顶部这个功能是系统自带的,只需要设置self.scrollView.scrollsToTop = YES即可, 但是这个属性有一个前提是窗口下必须只有一个可滚动的View才有效果,这时候就需要自定义创建一个窗口 来完成这个功能. 添加窗口 在AppDelegate创建一个新的窗口必须给这个窗口设置一个根控制器,否则会报错,这里可以通过dispatch_after来给添加窗口一个延时就可以不设置根控制器 窗口是有级别的windowLevel,级别越高就越显示在顶部,如果级别一样,那么