博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios实现类似魔兽小地图功能 在
阅读量:5050 次
发布时间:2019-06-12

本文共 3929 字,大约阅读时间需要 13 分钟。

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

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

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

看图。

 

 

SmallMapView.h

////  SmallMapView.h//  littleMapView////  Created by fuqiang on 13-7-2.//  Copyright (c) 2013年 fuqiang. All rights reserved.//#import 
#import
@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://www.cnblogs.com/CCSSPP/p/3201044.html

你可能感兴趣的文章
Redis学习---Redis操作之其他操作
查看>>
WebService中的DataSet序列化使用
查看>>
BZOJ 1200 木梳
查看>>
【Linux】【C语言】菜鸟学习日志(一) 一步一步学习在Linxu下测试程序的运行时间...
查看>>
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
https 学习笔记三
查看>>
华为“云-管-端”:未来信息服务新架构
查看>>
基于Sentinel实现redis主从自动切换
查看>>
函数(二)
查看>>
oracle中所有存在不存在的用户都可以使用dba连接到数据库
查看>>
函数式编程思想
查看>>
java安全沙箱(二)之.class文件检验器
查看>>
Oracle学习之简单查询
查看>>