• ios实现类似魔兽小地图功能 在


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

    比如你有一个可以放大缩小的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

  • 相关阅读:
    SQL中的max()函数用法
    C#多线程
    C#操作redis
    spring+mybatis 多数据库事务
    实战项目中 :一个业务对多个数据库操作的同步的处理办法(要么都成功,要么都失败)Threadlocal 数据库事务
    redis之数据操作详解
    C# 两个数组取交集/补集 Intersect()
    MySQL创建索引
    MySQL每日执行
    MySQL删除重复数据
  • 原文地址:https://www.cnblogs.com/CCSSPP/p/3201044.html
Copyright © 2020-2023  润新知