服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS实现点击状态栏自动回到顶部效果详解

iOS实现点击状态栏自动回到顶部效果详解

2021-01-25 16:13鲲鹏DP IOS

在IOS开发过程中,经常会有这种需求,需要通过点击状态栏返回到顶部,给用户更好的体验效果,下面这篇文章给大家详细介绍了实现过程,有需要的可以参考借鉴。

前言

大家都知道实现状态栏(statusbar)点击自动回到顶部效果,旨在为用户在浏览界面时提供便利,点击状态栏能够快速回到界面顶部,所以主要针对可以滚动的uiscrollview和其子类uitableviewuicollectionview

这里将从以下几个方面实现该功能。

1.苹果自带功能

分析:

首先,苹果自己已经提供了该功能,往上滑动tabview,点击statusbartableview会自动回到初始位置。如下图所示,此时点击statusbar,屏幕最上方显示的将是第一个cell。在一个控制器上添加一个tabview,那么默认点击statusbar是可以自动回到顶部的。

iOS实现点击状态栏自动回到顶部效果详解

既然苹果已经提供了该功能,我们直接拿来用就好了,干嘛还要自己实现呢?

其实不然,在一些情况下该功能是无效的。比如,在窗口上同时存在两个或两个以上uiscrollview或其子类时。例如,将上面的tabview先添加到一个scrollview上,然后再将该scrollview添加到控制器的view上,此时点击statusbar,tabview不能自动回到顶部。

因为,该效果是否有效,与 scrollstotop属性相关。查看官方文档,以下几点值得注意:

      1.默认情况下scrollstotop是为yes的,只有当该属性为yes时,点击statusbar才有效。

      2.该效果是让距离statusbar最近的scrollview自动回到顶部

      3.在iphone屏幕上方,当存在多个scrollview(或其子类),如果scrollstotop= yes scrollview超过一个,所有scrollview都不会响应statusbar的点击。

小结:

从上面分析我们可以得出结论:我们必须保证窗口上scrollstotop == yesscrollview(及其子类)同一时间内有且只有一个。这一样才能保证点击statusbar,该唯一存在的scrollview能自动回到顶部。

如何保证苹果自带的该功能一直好使呢?

解决办法:我们希望回到顶部的scrollviewscrollstotop =yes,其他scrollstotop = no

有时,为了满足某种需求,我们在一个scrollview上面会添加多个tabview,实现上下滑动显示cell的不同内容,左右滑动可以切换不同的tabview,这时点击statusbar是没有效果的。因为所有的scrollviewscrollstotop =yes。要想展示每个tableview时,点击statusbar都有效,必须让除了展示在最上面的tabview以外的所有的scrollviewscrollstotop =no。这就需要去判断,到底显示的是哪一个tabview

参考代码如下:

1.让最下面的scrollviewscrollstotop =no。其他tableview都是该scrollview的子类。

2.遍历判断

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 控制scrollview的scrollstotop属性
for (nsinteger i = 0; i < self.childviewcontrollers.count; i++) {
 uiviewcontroller *childvc = self.childviewcontrollers[i];
 
 // 如果控制器的view没有被创建,跳过
 if (!childvc.isviewloaded) continue;
 
 // 如果控制器的view不是scrollview,就跳过
 if (![childvc.view iskindofclass:[uiscrollview class]]) continue;
 
 // 如果控制器的view是scrollview
 uiscrollview *scrollview = (uiscrollview *)childvc.view;
 scrollview.scrollstotop = (i == index);
}

2.自己实现

statusbar的区域添加一个遮盖,监听遮盖的点击事件。

uiview

首先我们想到用uiview来做这个遮盖。但是,在这里我们使用uiview是着不住statusbar的,uiview会一直在statusbar的下面,所以不能接收点击事件。因为statusbar其实是一个uiwindow,且优先级高于下面的keywindow。所以,添加的uiview会在statusbar的下面。

iOS实现点击状态栏自动回到顶部效果详解

uiwindow

由于优先级的关系,我们可以用一个uiwindow来做遮盖,设置遮盖window的优先级高于statusbar即可。当然,设置最高优先级(uiwindowlevelalert)肯定是可以的。然后给遮盖window添加一个点击事件,背景色设置透明即可。

iOS实现点击状态栏自动回到顶部效果详解

?
1
2
3
4
5
6
7
8
9
10
11
dispatch_after(dispatch_time(dispatch_time_now, (int64_t)(0.1 * nsec_per_sec)), dispatch_get_main_queue(), ^{
 
 uiwindow * coverwindow =[[uiwindow alloc]initwithframe:cgrectmake(0, 0, [uiscreen mainscreen].bounds.size.width, 20)];
 self.coverwindow = coverwindow;
 coverwindow.hidden = no;
 coverwindow.backgroundcolor = [uicolor redcolor];
 coverwindow.windowlevel = uiwindowlevelalert;
 //添加手势
 uitapgesturerecognizer *tap = [[uitapgesturerecognizer alloc]initwithtarget:self action:@selector(coverwindowclick)];
 [self.coverwindow addgesturerecognizer:tap];
});
?
1
2
3
4
5
6
- (void)coverwindowclick {
 [uiview animatewithduration:0.5 animations:^{
 
  self.tableview.contentoffset = cgpointmake(0, 0);
 }];
}

appdelegate中直接监听statusbar的点击

appdelegate中实现touchesbegan:方法

?
1
2
3
4
5
- (void)touchesbegan:(nsset<uitouch *> *)touches withevent:(uievent *)event {
  if ([touches.anyobject locationinview:nil].y > 20) return;
 [[nsnotificationcenter defaultcenter]postnotificationname:@"click" object:nil];
 
}

接收通知,修改tabviewcontentoffset

?
1
2
3
4
5
6
- (void)coverwindowclick {
 [uiview animatewithduration:0.5 animations:^{
 
  self.tableview.contentoffset = cgpointmake(0, 0);
 }];
}

总结

以上就是这篇文章的全部内容,希望对大家开发ios能有所帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

延伸 · 阅读

精彩推荐
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28