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];
    }
    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    第13周学习进度情况
    【Android进阶】获取Android软件的版本信息
    【Android进阶】Android程序与JavaScript之间的简单调用
    字符串长度
    约瑟夫问题
    输入n个数和输出调整后的n个数
    输入三个整数,按由小到大的顺序输出
    学校oj平台上不去
    输入10个整数
    输入三个字符串,按由小到大的顺序输出
  • 原文地址:https://www.cnblogs.com/chglog/p/4829700.html
Copyright © 2011-2022 走看看