当前位置: 首页 > news >正文

iOS-点击状态栏返回到顶部效果

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

一、前言

在我们IOS开发中,UIScrollView自带有点击顶部状态栏自动返回顶部的效果,不过这个效果是有约束条件的:

// 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`, and it is not already at the top.
// 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.
@property(nonatomic) BOOL  scrollsToTop __TVOS_PROHIBITED;          // default is YES.

即这个手势只能作用在一个scrollView上,当发现多个时,手势将会失效。
在实际应用中,我们可能会有多个scrollView(包含UITableView/UICollectionView),如汽车之家、网易新闻、爱奇艺等等应用,这时候,系统默认的点击状态栏返回到顶部效果就会失效,我们就得自己自定义控件来实现此功能了。

二、主要技术点

抛开常用的技术点,主要用到的技术点有:

  • 多窗口应用
  • 递归
  • 坐标系转换
  • 触摸事件响应(横竖屏切换时需要)

PS:由于最近刚回武汉忙着找工作,所以没有花太多时间在简书上面,我先把代码放上来,后续再重新整理

#import "TopWindow.h"

@implementation TopWindow

static UIWindow *topWindow_;

/**
 * 显示顶部窗口
 */
+ (void)show
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        topWindow_ = [[UIWindow alloc] init];
        topWindow_.windowLevel = UIWindowLevelAlert;
        topWindow_.frame = [UIApplication sharedApplication].statusBarFrame;
        topWindow_.backgroundColor = [UIColor clearColor];
        topWindow_.hidden = NO;
        [topWindow_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
    });
}

/**
 * 监听顶部窗口点击
 */
+ (void)topWindowClick
{
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    [self searchAllScrollViewsInView:keyWindow];
}

/**
 * 找到参数view中所有的UIScrollView
 */
+ (void)searchAllScrollViewsInView:(UIView *)view
{
    // 递归遍历所有的子控件
    for (UIView *subview in view.subviews) {
        [self searchAllScrollViewsInView:subview];
    }


    // 判断子控件类型(如果不是UIScrollView,直接返回)
    if (![view isKindOfClass:[UIScrollView class]]) return;

    // 找到了UIScrollView
    UIScrollView *scrollView = (UIScrollView *)view;

    // 判断UIScrollView是否和window重叠(如果UIScrollView跟window没有重叠,直接返回)
    if (![scrollView bs_intersectsWithAnotherView:nil]) return;

    // 让UIScrollView滚动到最前面
    // 让CGRectMake(0, 0, 1, 1)这个矩形框完全显示在scrollView的frame框中
    [scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}

@end

转载于:https://my.oschina.net/mexiaobai1315/blog/1502941

相关文章:

  • Golang高性能json包:easyjson
  • [图像识别] 1、如何识别一个指针式的时种的时间?
  • 用标准C编写COM(一)
  • Nginx+Spring boot配置https
  • python全栈开发从入门到放弃之常用模块和正则
  • WebSphere ssl证书公钥少于2048问题处理
  • MySQL运维实战(一)之 系统变量潜规则
  • 大数运算模板(高精度)
  • ajax基础一
  • Struts2验证框架的配置及validation.xml常用的验证规则
  • 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现
  • oracle的loop等循环语句的几个用法小例子[转]
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 浪漫纯白记录爱的轨迹 西部数据移动存储“七夕”献礼
  • 六大存储技术或将敲响硬盘丧钟
  • “大数据应用场景”之隔壁老王(连载四)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • JavaScript 基本功--面试宝典
  • JS变量作用域
  • JS专题之继承
  • Laravel Telescope:优雅的应用调试工具
  • mysql中InnoDB引擎中页的概念
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • uni-app项目数字滚动
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Vue组件定义
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 力扣(LeetCode)56
  • 聊聊sentinel的DegradeSlot
  • 前端路由实现-history
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​MySQL主从复制一致性检测
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (11)MATLAB PCA+SVM 人脸识别
  • (12)目标检测_SSD基于pytorch搭建代码
  • (14)Hive调优——合并小文件
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)llvm ir转换过程
  • (阿里云万网)-域名注册购买实名流程
  • (区间dp) (经典例题) 石子合并
  • (转)德国人的记事本
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET下ASPX编程的几个小问题
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @JSONField或@JsonProperty注解使用
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [.NET]桃源网络硬盘 v7.4
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++]模板与STL简介