UIScrollView与地图页面嵌套效果的实现。
经常使用美团或饿了的朋友都会在订单页看到一个效果,上面是个地图,下面是订单的详情。向上滑动的时候地图被覆盖掉,滑下来地图出现,而且滑动地图时只有地图的mapview在动。这种效果怎么实现呢?今天来做一下这个demo。
先放效果图,两种实现方式,两种效果:
1:地图随着scroll的滑动而滑动
“gif有点大,CSDN不让传,请点击查看原图链接”
2,地图不动。scroll自己滑动
“这个gif也有点大,CSDN不让传,请点击查看原图链接”
先说下第一种实现,上代码
@interface MapScrollViewController ()<MKMapViewDelegate,UIGestureRecognizerDelegate>@property (nonatomic, strong) UIScrollView *mapScv;@end@implementation MapScrollViewController- (void)viewDidLoad {[super viewDidLoad];_mapScv = [[UIScrollView alloc] init];_mapScv.alwaysBounceVertical = YES;_mapScv.scrollEnabled = YES;_mapScv.contentInset = UIEdgeInsetsMake(300, 0, 0, 0);[self.view addSubview:_mapScv];[_mapScv mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(self.view);}];UIGestureRecognizer *mainScrollVTap = [[UIGestureRecognizer alloc]init];mainScrollVTap.delegate=self;[_mapScv addGestureRecognizer:mainScrollVTap];UIView *contentView = [UIView new];[_mapScv addSubview:contentView];[contentView mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.width.mas_equalTo(_mapScv);}];UIView *view = [UIView new];view.backgroundColor = [UIColor redColor];[contentView addSubview:view];[view mas_makeConstraints:^(MASConstraintMaker *make) {make.size.mas_equalTo(CGSizeMake(kScreenWidth, 2000));make.left.top.equalTo(contentView);}];[contentView mas_updateConstraints:^(MASConstraintMaker *make) {make.bottom.mas_equalTo(view);}];MKMapView *map1 = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 300)];map1.delegate = self;map1.mapType = MKMapTypeStandard;[contentView addSubview:map1];
}-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{//判断如果是百度地图的view 既可以实现手势拖动 scrollview 的滚动关闭if ([gestureRecognizer.view isKindOfClass:[MKMapView class]] ){_mapScv.scrollEnabled = NO;return YES;}else{_mapScv.scrollEnabled = YES;return NO;}
}
这样就能实现图1的效果,实现的手段主要是在self.view上添加一个全屏的UIScrollView,把地图的view作为它的子视图,然后给scroll添加一个手势,在滑动的时候去手势的代理里面判断让scroll可不可以滚动即可,当scroll滚动时。会推着地图view向上走,当滑动地图时,scroll就会不可滚动,很简单的一个实现。
第二种比较通用,看起来也比较好看,实现起来比第一种还要简单,代码:
@interface MapScrollView : UIScrollView@end@implementation MapScrollView- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{UIView *hitView = [super hitTest:point withEvent:event];if ([hitView isKindOfClass:[self class]]) {return nil;}return hitView;
}@end@interface MapScrollViewController ()<MKMapViewDelegate,UIGestureRecognizerDelegate>@property (nonatomic, strong) MapScrollView *mapScv;@end@implementation MapScrollViewController- (void)viewDidLoad {[super viewDidLoad];MKMapView *map1 = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 300)];map1.delegate = self;map1.mapType = MKMapTypeStandard;[self.view addSubview:map1];_mapScv = [[MapScrollView alloc] init];_mapScv.alwaysBounceVertical = YES;_mapScv.scrollEnabled = YES;_mapScv.contentInset = UIEdgeInsetsMake(300, 0, 0, 0);[self.view addSubview:_mapScv];[_mapScv mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(self.view);}];UIView *contentView = [UIView new];[_mapScv addSubview:contentView];[contentView mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.width.mas_equalTo(_mapScv);}];UIView *view = [UIView new];view.backgroundColor = [UIColor redColor];[contentView addSubview:view];[view mas_makeConstraints:^(MASConstraintMaker *make) {make.size.mas_equalTo(CGSizeMake(kScreenWidth, 2000));make.left.top.equalTo(contentView);}];[contentView mas_updateConstraints:^(MASConstraintMaker *make) {make.bottom.mas_equalTo(view);}];
}@end
首先我们写一个继承UIScrollView父类的MapScrollView,实现hitTest方法。
这个hitTest方法的意思就是当滑动和点击时需要处理的事件的响应链,该处理哪个view。比如我在Aview点击时,系统需要知道该处理Aview了,这时你说不要去处理A,系统就说那你告诉我该处理谁,然后然你用这个方法告诉系统该去处理Bview。就是这么个意思。默认的就是哪个view发生的事件就会处理哪个view。
UIView *hitView = [super hitTest:point withEvent:event];
if ([hitView isKindOfClass:[self class]]) {
return nil;
}
return hitView;
这段代码就是说如果当前滑动点击的视图是scroll的话,那么就不要处理了。只滑动即可,这样就不会触发地图的事件。地图也就不会跟着滑动。
在这个例子里,mapview在视图的最底部,scroll在它上面,然后scroll滑动范围是全屏的,但是展示的范围不能全屏,需要设置contentinset。
这样就实现了这个简单的需求,怎么样,一点也不复杂吧。
原文链接:http://zhangqq166.cn/archives/ios/scroll-map/,希望大家多多关注
本人创建了一个公众号,里面每天发一些教程进阶知识,有的是本人总结所得,有的是转载大神的文章,大家一起分享看。
UIScrollView与地图页面嵌套效果的实现。相关推荐
- 自学Web开发第十二天-基于VB和ASP.NET;页面嵌套、母版、网站导航
自学Web开发第十二天-基于VB和ASP.NET:页面嵌套.母版.网站导航 页面嵌套 母版页 母版页的建立和使用 访问母版页上的元素 网站导航 站点地图 SiteMapDataSource控件 地图信 ...
- [html] a标签可以再嵌套a标签吗?为什么?如果不行,那又想要嵌套效果怎么解决呢?
[html] a标签可以再嵌套a标签吗?为什么?如果不行,那又想要嵌套效果怎么解决呢? a标签不能嵌套a标签<a href="https://www.baidu.com/" ...
- vue 引入json地图_使用vue引入maptalks地图及聚合效果的实现
1.安装maptalks.js npm install maptalks --save 2.安装聚合mapkercluster npm install maptalks.markercluster 3 ...
- 如何将一个HTML页面嵌套在另一个页面中
如何将一个HTML页面嵌套在另一个页面中 2010-05-05 16:45 559人阅读 评论(1) 收藏 举报 这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页 ...
- iframe标签(页面嵌套)
开发工具与关键技术:VS <iframe> 作者:听民谣的老猫 撰写时间:2019/6/10 18:15 上面两张图是两个不同的页面但是它们的基本框架都是一样,每点击一次左边的导航栏改变的 ...
- 如何将一个HTML页面嵌套另一个页面中
如何将一个HTML页面嵌套另一个页面中 这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可.这样便于维护,如果有很多网页,当通用 ...
- html页面嵌套html页面
这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可.这样便于维护,如果有很多网页,当通用内容需要修改时,只改一个文件就可以了,不 ...
- 用iframe完成页面嵌套
用iframe完成页面嵌套 作者:吱韩菌 开发工具:Visual Studio 2015 撰写时间:2019-5-31 今天要给大家展示的是如何运用iframe标签完成页面嵌套.下面我们要做的是用if ...
- h5 iframe嵌套页面_如何将一个HTML页面嵌套在另一个页面中
展开全部 这个在做网页中常e69da5e887aa62616964757a686964616f31333339666636要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要 ...
- html右侧浮动栏随着滚动,jQuery实现div浮动层跟随页面滚动效果
jQuery实现浮动层跟随页面滚动效果 #main{height:2000px} .demo{width:180px; height:250px; margin:10px; border:2px so ...
最新文章
- javascript事件模型框架
- VS2017桌面应用程序打包成.msi或者.exe
- java编写地铁购票系统_Java_地铁购票系统
- SAP CRM WebClient UI cross component跳转中有一个硬编码的CROSSNAV
- C - Insertion Sort Gym - 101955C(2018icpc沈阳/打表找规律)
- 华为融合位置服务器,融合服务器
- php 连接timesten,timesten常见的一些简单问题
- LabVIEW网络数据传输远程控制编程与验证测试
- 神州数码交换机配置基本命令
- 拒绝访问,文件或目录损坏且无法读取解决办法
- spring-boot 与 elasticsearch 版本对应
- Win10自带浏览器MicroEdge无法打开网页---解决办法
- EFI Driver Model(中)-PCI 驱动设计
- 倍福--电子凸轮的基本配置
- Qt 学习(三) —— Qt 模块
- rtx3050和rtx3060差距大吗 rtx3050和rtx3060的区别
- rtl8812驱动分析(二)
- 2021-09-30《工程技术》期刊发表
- 再也不要相信你的眼睛:步步逼近的AI换脸术
- 2×3卡方检验prism_SPSS系列|手把手教你做卡方检验