zoukankan      html  css  js  c++  java
  • iOS开发——项目需求-快速回到当前界面的顶部

    利用UIWindow实现快速到达顶部

    如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部

    核心代码

    一、利用UIWindow实现到达顶部
    1、创建一个新的窗口
    1)UIWindow的级别,级别越高,越显示在上层(级别高的window盖在级别低的window上面)
    UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert

    @interface AppDelegate ()
    @property (nonatomic, strong) UIWindow *topWindow;
    @end
    
    @implementation AppDelegate
    
    - (UIWindow *)topWindow{
        
        if (_topWindow == nil) {
            
            _topWindow = [[UIWindow alloc] init];
            
            _topWindow.windowLevel = UIWindowLevelAlert;
            _topWindow.frame = CGRectMake(0, 0, CHGScreenW, 20);
            _topWindow.backgroundColor = [UIColor clearColor];
            // 这句很重要,默认是隐藏的,要想显示必须手动设置为NO
            _topWindow.hidden = NO;
            [_topWindow addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
        }
        return _topWindow;
    }

    2、遍历每一个窗口

    - (void)topWindowClick
    {
        NSArray *windows = [UIApplication sharedApplication].windows;
        for (UIWindow *window in windows) {
          // 遍历该窗口下所有子控件 [self searchSubviews:window]; } }

    3、遍历该窗口下所有子控件

    /**
     * 搜索superview内部的所有子控件
     */
    - (void)searchSubviews:(UIView *)superview
    {
        for (UIScrollView *scrollView in superview.subviews) {
            [self searchSubviews:scrollView];
            
            // 判断是否为 scrollView
            if (![scrollView isKindOfClass:[UIScrollView class]]) continue;
            
            // 判断scrollView是否在窗口上 (是否相交)
            // 计算出scrollView在window坐标系上的矩形框
            CGRect scrollViewRect = [scrollView convertRect:scrollView.bounds toView:scrollView.window];
            CGRect windowRect = scrollView.window.bounds;
            // 判断scrollView的边框是否和window的边框交叉
            if (!CGRectIntersectsRect(scrollViewRect, windowRect)) continue;
            
            // 能来到这里说明scrollView在窗口上,修改偏移量,滚到最顶部
            CGPoint offset = scrollView.contentOffset;
            offset.y =  - scrollView.contentInset.top;
            [scrollView setContentOffset:offset animated:YES];
        }
    }

    4、程序激活时主动调用懒加载

    // 程序激活的时候调用topWindow
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        [self topWindow];
    }
    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    [转]Sublime Text 3安装Json格式化插件
    Golang 新手可能会踩的 50 个坑【转】
    [golang]svg图片默认按照左上角旋转,改为按中心旋转,重新计算中心偏移量
    序列化是干什么的,有什么作用,什么情况下会用到?
    Hbase设置多个hmaster
    基于JMX动态配置Log4J日志级别
    面向过程与面向对象编程的区别和优缺点
    log4j自带的两个类MDC和NDC作用以及用途
    【架构师之路】集群/分布式环境下5种session处理策略
    Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题
  • 原文地址:https://www.cnblogs.com/chglog/p/4829700.html
Copyright © 2011-2022 走看看