写了一个类似魔兽小地图功能的控件。
比如你有一个可以放大缩小的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
如果有需要的,可以去这里得到源码: