写了一个类似魔兽小地图功能的控件。

比如你有一个可以放大缩小的scrollView。会在里面进行一些放大缩小,点击里面的按钮呀,等操作。

这个小地图控件。就会和你的大scrollView同步。并有缩略图和你当前视口的位置。就像游戏里那样。

看图。

SmallMapView.h

//
//  SmallMapView.h
//  littleMapView
//
//  Created by fuqiang on 13-7-2.
//  Copyright (c) 2013年 fuqiang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>@interface SmallMapView : UIView//缩放比例
@property (nonatomic,assign,readonly)float scaling;//标示窗口位置的浮动矩形
@property (nonatomic,retain,readonly)CALayer *rectangleLayer;//内容
@property (nonatomic,retain,readonly)CALayer *contentLayer;//被模拟的UIScrollView
@property (nonatomic,retain,readonly)UIScrollView *scrollView;//init
- (id)initWithUIScrollView:(UIScrollView *)scrollView frame:(CGRect)frame;//在UIScrollView的scrollViewDidScroll委托方法中调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;//重绘View内容(需要注意。如果在调用reloadSmallMapView 方法的时候,需要更新的内容内有动画。如按钮变色等)
//请用[self performSelector:@selector(reloadSmallMapView:) withObject:nil afterDelay:0.2];
- (void)reloadSmallMapView;
@end

SmallMapView.m

//
//  SmallMapView.m
//  littleMapView
//
//  Created by fuqiang on 13-7-2.
//  Copyright (c) 2013年 fuqiang. All rights reserved.
//

#import "SmallMapView.h"@implementation SmallMapView- (id)initWithUIScrollView:(UIScrollView *)scrollView frame:(CGRect)frame
{self = [super init];if (self) {_scrollView = scrollView;//设置缩略图View尺寸
        [self setFrame:frame];//设置缩略图缩放比例
        [self setScaling:_scrollView];//设置罗略图内容_contentLayer = [self drawContentView:_scrollView frame:frame];[self.layer addSublayer:_contentLayer];//初始化缩略移动视口_rectangleLayer = [[CALayer alloc] init];_rectangleLayer.opacity = 0.5;_rectangleLayer.shadowOffset = CGSizeMake(0, 3);_rectangleLayer.shadowRadius = 5.0;_rectangleLayer.shadowColor = [UIColor blackColor].CGColor;_rectangleLayer.shadowOpacity = 0.8;_rectangleLayer.backgroundColor = [UIColor whiteColor].CGColor;_rectangleLayer.frame = CGRectMake(0, 0, scrollView.frame.size.width * _scaling, scrollView.frame.size.height * _scaling);[self.layer addSublayer:_rectangleLayer];}return self;
}- (void)dealloc
{[_rectangleLayer release];[super dealloc];
}//------
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{[self setScaling:scrollView];float x = scrollView.contentOffset.x;float y = scrollView.contentOffset.y;float h = scrollView.frame.size.height;float w = scrollView.frame.size.width;[self.rectangleLayer setFrame:CGRectMake(x * _scaling, y * _scaling, h * self.scaling, w * self.scaling)];
}//重绘View内容
- (void)reloadSmallMapView
{[_contentLayer removeFromSuperlayer];_contentLayer = [self drawContentView:_scrollView frame:self.frame];[self.layer insertSublayer:_contentLayer atIndex:0];
}//设置缩略图缩放比例
- (void)setScaling:(UIScrollView *)scrollView
{_scaling = self.frame.size.height / scrollView.contentSize.height;
}//复制UIScrollView中内容
- (CALayer *)drawContentView:(UIScrollView *)scrollView frame:(CGRect)frame
{[self setScaling:scrollView];CALayer *layer = [[CALayer alloc] init];layer.frame = frame;for (UIView *view in scrollView.subviews){UIGraphicsBeginImageContext(view.bounds.size);[view.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();CALayer *copyLayer = [CALayer layer];copyLayer.contents = (id)image.CGImage;float x = view.frame.origin.x;float y = view.frame.origin.y;float h = view.frame.size.height;float w = view.frame.size.width;copyLayer.frame = CGRectMake(x * _scaling,y *_scaling,w * _scaling,h * _scaling);[layer addSublayer:copyLayer];}return [layer autorelease];
}
@end

如果有需要的,可以去这里得到源码:https://github.com/TinyQ/LittleMapView.git

转载于:https://www.cnblogs.com/CCSSPP/p/3201044.html

ios实现类似魔兽小地图功能 在相关推荐

  1. iOS开发-类似微信录音上滑取消功能

    iOS开发-类似微信录音上滑取消功能 前言 效果 代码 先自定义UIButton 使用 监听上下滑动代码 前言 在社交媒体中开发中遇到需要做类似微信录音上滑取消功能,例子,虽然不是很好看,但是细节满满 ...

  2. iOS语音直播SDK及功能实现流程

    语音直播场景的典型使用案例是同一房间内的成员,进行语音直播,有需要时也可进行实时语音通话.Zego 提供了对语音直播场景的支持,此文讲述如何在iOS环境下利用即构SDK快速实现语音直播功能. 实现播放 ...

  3. Unity_实现小地图功能

    在Unity中,模拟类似英雄联盟和csgo中 左上角小地图的功能 思路:在游戏中,玩家有两个视角,一个是玩家的游戏主视角,一个是小地图的视角,每个视角所看到的画面是不一样的,我们只需要创建两个摄像机, ...

  4. Mac——技巧:如何在iPhone 上获取 iOS 15 的实时文本功能

    尽管目前的iOS 15只是一个测试版本,但是它已经足够让我们惊喜了,无论是FaceTime的屏幕共享功能还是最新的聚焦模式,实际上都能在很大程度上改变我们手机体验的方式,而且从目前的效果来看,这种方式 ...

  5. 【转】在OpenGL场景中实现小地图功能

    http://www.c3dn.net/archiver/?tid-48.html 想象一下,我们在原始森林里寻找宝藏,没有地图,没有GPS,那结果应该只有一种:不但找不到目标地点,而且很容易迷失方向 ...

  6. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  7. ios 扫码枪外设 键盘模式_苹果iOS 13新增滑行键入功能 开启新键盘模式

    滑行输入又称扫屏输入,是近年触摸屏幕/触摸键盘上流行的输入技术,它的特点是:你只需要在要录入单词的几个字母之间滑行,系统词库就能把你需要的单词给找出来,无需考虑顺序.排列.冗余甚至无需考虑多输入进去的 ...

  8. 【高德LBS开源组件大赛】iOS版地图选中Overlay功能组件

    2019独角兽企业重金招聘Python工程师标准>>> ##开源组件名称 iOS版地图选中Overlay功能组件​ ##开源组件说明及使用场景 提供在iOS版地图中选中Overlay ...

  9. ios6.1.6可用微信_这是iOS 12.1的新增功能,今天可用

    ios6.1.6可用微信 While iOS 12 is still fairly fresh, the first point release will be rolling out startin ...

  10. Swift实现iOS录音与播放音频功能

    Swift实现iOS录音与播放音频功能 作用 AVPLayer:可以用来播放在线及本地音视频 AVAudioSession:音频会话,主要用来管理音频设置与硬件交互 使用时需要导入 #import & ...

最新文章

  1. Android性能优化工具
  2. 嫌微软要价“太狠” 东莞网吧巨头拒绝付费
  3. hibernate_day03_一对多相关操作
  4. 以实际产品为例, 进行软件工程训练的作业
  5. 聚合项目访问后台接口失败_【2020】Scry 8月项目进度月报
  6. 征途手游2新开区服务器维护多久,《征途2手游》开启新服“星火燎原”
  7. linux中c语言常用内嵌汇编
  8. ctypealpha php_PHP Ctype函数(转)
  9. 小程序报错:Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail req..
  10. vs 2017 查看dll源代码
  11. FIFO IP核的使用
  12. 微信小程序 09 前后端交互
  13. 这才是2019年最新资料!
  14. 编写一个“绘画系统”
  15. (1)Terminal 终端终结者——安装和使用快捷键
  16. 捞王二闯IPO,谁是“火锅第三股“?||Review
  17. 联想拯救者刃7000P跑分与加装内存条和SSD固态硬盘
  18. 计算机网络资料整理《谢希仁版》
  19. 集合数据hdu1272(小希迷宫 并查集)
  20. Received status code 400 from server: Bad Request解决方案

热门文章

  1. html 判断undefined,JS中 “is not defined” 如何判断defined,defined和undefined 的区别
  2. 解决问题multiply defined
  3. java Io,读写文件拒绝访问
  4. 形容人的内核是什么意思_cpu核数是什么意思
  5. 一个线程OOM,进程里其他线程还能运行么?
  6. day03-搭建项目
  7. 自训练和半监督学习介绍
  8. Qt自定义Combobox实现列表上拉展示
  9. 【书影观后感 四】《围城》十年
  10. 学习笔记1--汽车发展史及发展趋势