经常使用美团或饿了的朋友都会在订单页看到一个效果,上面是个地图,下面是订单的详情。向上滑动的时候地图被覆盖掉,滑下来地图出现,而且滑动地图时只有地图的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与地图页面嵌套效果的实现。相关推荐

  1. 自学Web开发第十二天-基于VB和ASP.NET;页面嵌套、母版、网站导航

    自学Web开发第十二天-基于VB和ASP.NET:页面嵌套.母版.网站导航 页面嵌套 母版页 母版页的建立和使用 访问母版页上的元素 网站导航 站点地图 SiteMapDataSource控件 地图信 ...

  2. [html] a标签可以再嵌套a标签吗?为什么?如果不行,那又想要嵌套效果怎么解决呢?

    [html] a标签可以再嵌套a标签吗?为什么?如果不行,那又想要嵌套效果怎么解决呢? a标签不能嵌套a标签<a href="https://www.baidu.com/" ...

  3. vue 引入json地图_使用vue引入maptalks地图及聚合效果的实现

    1.安装maptalks.js npm install maptalks --save 2.安装聚合mapkercluster npm install maptalks.markercluster 3 ...

  4. 如何将一个HTML页面嵌套在另一个页面中

    如何将一个HTML页面嵌套在另一个页面中 2010-05-05 16:45 559人阅读 评论(1) 收藏 举报 这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页 ...

  5. iframe标签(页面嵌套)

    开发工具与关键技术:VS <iframe> 作者:听民谣的老猫 撰写时间:2019/6/10 18:15 上面两张图是两个不同的页面但是它们的基本框架都是一样,每点击一次左边的导航栏改变的 ...

  6. 如何将一个HTML页面嵌套另一个页面中

    如何将一个HTML页面嵌套另一个页面中 这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可.这样便于维护,如果有很多网页,当通用 ...

  7. html页面嵌套html页面

    这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可.这样便于维护,如果有很多网页,当通用内容需要修改时,只改一个文件就可以了,不 ...

  8. 用iframe完成页面嵌套

    用iframe完成页面嵌套 作者:吱韩菌 开发工具:Visual Studio 2015 撰写时间:2019-5-31 今天要给大家展示的是如何运用iframe标签完成页面嵌套.下面我们要做的是用if ...

  9. h5 iframe嵌套页面_如何将一个HTML页面嵌套在另一个页面中

    展开全部 这个在做网页中常e69da5e887aa62616964757a686964616f31333339666636要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要 ...

  10. html右侧浮动栏随着滚动,jQuery实现div浮动层跟随页面滚动效果

    jQuery实现浮动层跟随页面滚动效果 #main{height:2000px} .demo{width:180px; height:250px; margin:10px; border:2px so ...

最新文章

  1. javascript事件模型框架
  2. VS2017桌面应用程序打包成.msi或者.exe
  3. java编写地铁购票系统_Java_地铁购票系统
  4. SAP CRM WebClient UI cross component跳转中有一个硬编码的CROSSNAV
  5. C - Insertion Sort Gym - 101955C(2018icpc沈阳/打表找规律)
  6. 华为融合位置服务器,融合服务器
  7. php 连接timesten,timesten常见的一些简单问题
  8. LabVIEW网络数据传输远程控制编程与验证测试
  9. 神州数码交换机配置基本命令
  10. 拒绝访问,文件或目录损坏且无法读取解决办法
  11. spring-boot 与 elasticsearch 版本对应
  12. Win10自带浏览器MicroEdge无法打开网页---解决办法
  13. EFI Driver Model(中)-PCI 驱动设计
  14. 倍福--电子凸轮的基本配置
  15. Qt 学习(三) —— Qt 模块
  16. rtx3050和rtx3060差距大吗 rtx3050和rtx3060的区别
  17. rtl8812驱动分析(二)
  18. 2021-09-30《工程技术》期刊发表
  19. 再也不要相信你的眼睛:步步逼近的AI换脸术
  20. 2×3卡方检验prism_SPSS系列|手把手教你做卡方检验

热门文章

  1. 盘一盘 Python 特别篇 18 - 时区|夏令时
  2. 安卓开发——修改Toolbar默认图标(如返回图标)的颜色
  3. 《紫川》之帝都风云 第三卷
  4. 2022软件测试校招笔试题-软件测试基本理论
  5. 7天快速掌握MySQL-DAY2
  6. ConvMAE:当Masked卷积遇见何恺明的MAE
  7. 儿童护眼灯哪个品牌最好?儿童护眼灯十大排行榜
  8. Java工作5年的迷茫,是否要转互联网?
  9. 计算机编程龟兔赛跑,实例编程:龟兔赛跑的小游戏
  10. 5G系统——连接管理CM