1:创建一个UIWindow,放在状态栏上面。
/** 位于状态栏,用于返回顶部*/
@property (nonatomic, strong) UIWindow *topWindow;
2:在viewDidLoad方法中创建。
- (void)viewDidLoad {
[super viewDidLoad];
//创建顶部window
[self topWindow];
}
3:添加顶部window,并实现点击功能。
#pragma mark - 添加顶部状态栏窗口
- (UIWindow *)topWindow
{
if (!_topWindow) {
_topWindow = [[UIWindow alloc] init];
UIViewController *vc = [[UIViewController alloc] init];
_topWindow.rootViewController = vc;
_topWindow.frame = CGRectMake(0, 0, kScreenWidth, 20);
_topWindow.hidden = NO;
_topWindow.backgroundColor = [UIColor clearColor];
[_topWindow addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
}
return _topWindow;
}
- (void)topWindowClick
{
// 取出所有的window
NSArray *windows = [UIApplication sharedApplication].windows;
// 遍历程序中的所有控件
for (UIWindow *window in windows) {
[self searchSubviews:window];
}
}
// 搜索superview内部的所有子控件
- (void)searchSubviews:(UIView *)superview
{
for (UIScrollView *scrollView in superview.subviews) {
[self searchSubviews:scrollView];
// 判断是否为scrollView
if (![scrollView isKindOfClass:[UIScrollView class]]) continue;
// 计算出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;
// 偏移量不一定是0
offset.y = - scrollView.contentInset.top;
[scrollView setContentOffset:offset animated:YES];
}
}
4:在控制器出现的时候,改变window的级别为UIWindowLevelAlert,消失的时候级别为UIWindowLevelNormal;以保证别处在使用的时候,不影响。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
_topWindow.windowLevel = UIWindowLevelAlert;
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
_topWindow.windowLevel = UIWindowLevelNormal;
}