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

比如你有一个可以放大缩小的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. 2016,除了 DevOps,企业还应该知道 CMDB!

    CMDB 是 Configuration Management Database(配置管理数据库)的简称,CMDB 存储与管理企业 IT 架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密 ...

  2. HDU 3047 Zjnu Stadium(带权并查集)

    题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...

  3. HUSTOJ(转发)

    来源:http://blog.csdn.net/xiajian2010/article/details/12954855 缘起 大四了,快毕业了,所以想准备点LAMP的知识和经验.刚好实验室里有人在搞 ...

  4. lintcode 中等题:find the missing number 寻找缺失的数

    题目 寻找缺失的数 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数. 样例 N = 4 且序列为 [0, 1, 3] 时,缺失的数为2. 注意 可以改变序 ...

  5. lintcode :reverse integer 颠倒整数

    题目: 颠倒整数 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 解题: 直接 ...

  6. Zookeeper安装部署

    Zookeeper安装 1. 安装 wget http://www.apache.org/dist//zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz ...

  7. REACTOS(193)与汇编编译器(69)的高人

    REACTOS(193)与汇编编译器(69)的高人http://blog.csdn.net/caimouse ReactOS编译成VS工程1: 首先从https://www.reactos.org/w ...

  8. [iOS]iPhone利用<极光推送>实现远程推送

    准备: 1. 一个Xcode工程 2. 开发者账号 3. 真机 (重要,模拟器无法进行远程推送,因为模拟器没有UDID) 第一步:绑定工程的Bundle Identifer 首先当然要登录https: ...

  9. NSArray 迭代

    NSObject *obj=[[NSObject alloc]init];        NSArray *array=[[NSArray alloc] initWithObjects:@" ...

  10. 实例学习Bloom Filter

    0. 科普1. 为什么需要Bloom Filter2. 基本原理3. 如何设计Bloom Filter4. 实例操作5. 扩展 0. 科普 Bloom Filter是由Bloom在1970年提出的一种 ...