利用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(, , CHGScreenW, );
_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];
}

iOS开发——项目需求-快速回到当前界面的顶部的更多相关文章

  1. ios开发怎样才能做到代码和界面彻底分离,方便换肤?

    设想一下,你现在手底下有N个开发人员,你如何让这些人参与到一个ios开发项目中来?而不是独自一个人完成.

  2. iOS开发项目之MVC与MVVM

    MVC MVC,Model-View-Controller,我们从这个古老而经典的设计模式入手.采用 MVC 这个架构的最大的优点在于其概念简单,易于理解,几乎任何一个程序员都会有所了解,几乎每一所计 ...

  3. iOS开发——项目篇—高仿百思不得姐

    01 一.包装为导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewControll ...

  4. iOS开发项目名称修改

    前言:在IOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译 ...

  5. iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView

    加号界面(发布模块) 一.点击加号modal出发布模块,创建控件,布局控件1)使用xib加载view,如果在viewDidLoad创建控件并设置frame 那么self.view 的宽高 拿到的是xi ...

  6. iOS开发项目之一 [ 项目流程]

    项目流程 *人员配置 *客户端(iOS工程师,Android工程师) *前端 h5 *后台人员(php,java,net) *提供接口(请求地址.请求参数,请求方式,接口文档) *UI UE * 效果 ...

  7. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  8. iOS开发项目实战——Swift实现ScrollView滚动栏功能

    手机作为一个小屏设备,须要显示的信息往往无法在一个屏幕上显示,此时就须要使用到滚动栏,当然除了像TableView这样能够自带滚动功能的. 假设一个界面上View较多,那就必须要使用到ScrollVi ...

  9. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

随机推荐

  1. $(document).ready、body.Onload()和 $(window).load的区别

    window.load(function(){...})和body.onload()都存在同样一个问题,那都是在页面所有元素(包括html标签以及引用到得所有图片,Flash等媒体)加载完毕后执行的, ...

  2. listen()

    创建一个套接口并监听申请的连接. #include <winsock.h> int PASCAL FAR listen( SOCKET s, int backlog); S:用于标识一个已 ...

  3. UDP 网络通信 C#

    接收端   using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Thre ...

  4. 第二轮冲刺-Runner站立会议02

    今天做了什么:查看gridview与baseadapter适配器 遇到的困难:继续gridview与baseadapter适配器 明天准备做什么:没有弄懂gridview与baseadapter适配器 ...

  5. Python基本运算符

    Python基本运算符 什么是操作符? 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符. Python语言支持操作者有以下几种类型. 算术运算符 比较(即关系)运算符 ...

  6. Realm简单使用小记

    一.项目环境:纯OC 载入Realm: pod 'Realm' 二.为了方便调用可以写一个Realm类的分类 #import <Foundation/Foundation.h> #impo ...

  7. php操作大文件

    看了http://hi.baidu.com/qiaoyuetian/item/76c51f0ce25030e4f45ba69e(php读取大文件详解),然后测试了里边的代码,发现一些错误, 总结,红色 ...

  8. Visual Studio Code 怎么支持中文

    这其实是编码问题 和字体什么的没有关系,在VSCode中默认是用UTF-8编码方式打开文件,只要你的文件是这个编码就能正常打开如果不是,不进行设置VSCode是不会自动切换编码方式打开 手动可以Reo ...

  9. Bitcask 存储模型

    Bitcask 存储模型 Bitcask 是一个日志型.基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak和 beansdb新版本. 日志型数据存储 何 ...

  10. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...