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

比如你有一个可以放大缩小的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(, );
_rectangleLayer.shadowRadius = 5.0;
_rectangleLayer.shadowColor = [UIColor blackColor].CGColor;
_rectangleLayer.shadowOpacity = 0.8;
_rectangleLayer.backgroundColor = [UIColor whiteColor].CGColor;
_rectangleLayer.frame = CGRectMake(, , 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:];
} //设置缩略图缩放比例
- (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

ios实现类似魔兽小地图功能 在的更多相关文章

  1. Jquery打造的类似新浪微博@提醒功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  3. 改进iOS客户端的升级提醒功能

    改进iOS客户端的升级提醒功能 功能设计 先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 "升级提示功能" 都不太友好.在此分享一下我的想法,欢迎 ...

  4. iOS 用UISearchDisplayController实现查找功能

    UISearchDisplayController是iOS中用于处理搜索功能的控制器,此控制器需要和UISearchBar结合使用 示例代码如下: // // WKRootViewController ...

  5. js/jQuery实现类似百度搜索功能

    一.页面代码:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...

  6. pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。

    Select rows from a DataFrame based on values in a column -pandas 筛选 https://stackoverflow.com/questi ...

  7. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

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

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

  9. ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

    ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...

随机推荐

  1. Appium对京东App中WebView的处理

    Appium用uiautomator无法对WebView进行className定位,所以只能模拟动作.可以用android sdk自带的monitor工具,先进行截图,再用任意图像处理软件,获取截图的 ...

  2. G家二面

    题目都很基本,都属于听说过但是不会做的…都是操作系统,compiler的概念题… 概念题郁闷就郁闷在不会就是不会,就算能扯两句也会被问倒… 算法就一个,pow(x, y),5分钟不到…… 不是听说G家 ...

  3. POJ 1733 Parity game(离散化+带权并查集)

    离散化+带权并查集 题意:长度为n的0和1组成的字符串,然后问第L和R位置之间有奇数个1还是偶数个1. 根据这些回答, 判断第几个是错误(和之前有矛盾)的. 思路:此题同HDU 3038 差不多,询问 ...

  4. hdu1022 Train Problem I

    http://acm.hdu.edu.cn/showproblem.php?pid=1022 #include<iostream> #include<stdio.h> #inc ...

  5. Openfire 代码部署报错: Variable references non-existent resource:${workspace_loc:openfire_src}

    Variable references non-existent resource:${workspace_loc:openfire_src} -DopenfireHome=“${workspace_ ...

  6. 安装ubuntu vi编辑无法正常使用的时候 如方向键变成ABCD

    http://blog.sina.com.cn/s/blog_7e3f6e8f0100vkon.html 在使用ubuntu的时候,发现vi编辑模式下退格键backspace和上下左右光标移动键不能用 ...

  7. Orcle数据库查询练习复习:四

    一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...

  8. java:抽象类和抽象函数

    面向对象:先抽象后具体 抽象类也叫基类 抽象函数:只有函数的定义,没有函数体的函数, 语法:类必须定义为抽象类,才能调用抽象函数,抽象类里面可以没有抽象函数 abstract class Printe ...

  9. 利用 __FUNCTION__ 宏打印函数调用信息

    __FUNCTION__ 宏表示当前所在函数名: __FILE__ 宏表示当前所在文件路径: __LING__ 宏表示当前所在行: 利用对象离开函数时调用析构函数销毁的特点,打印出函数执行结束的信息 ...

  10. 9、JPA_映射双向一对一的关联关系

    双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...