• 实现图片的移动和缩放的功能类(move and zoom)


    头文件

    --------------------------------------------------------------------------------------------

    EditImgView.h

    #import <Foundation/Foundation.h>

    #import <QuartzCore/QuartzCore.h>

    @interface EditImgView : UIImageView {

        CGFloat zoom;

        CGPoint previousPoint; // used in move

        BOOL moving;

        CGFloat previousDistance; // used in pinch zoom

    }

    -(id)initWithImg:(UIImage*)img;

    -(void)configureTiledLayer;

    @end

    --------------------------------------------------------------------------------------------

    实现类

    ---------

    EditImgView.m

    #import "EditImgView.h"

    #import "Logger.h"

    #define EXPAND_FRE  5/4

    #define REDUCE_FRE  4/5

    #define MIDDLE_FRE  1

    #define MULTIPLE    3

    @implementation EditImgView

    -(id)initWithImg:(UIImage*)img

    {

        if (self = [super init])

        {

            self.image = img;

            self.userInteractionEnabled = YES;

            self.multipleTouchEnabled = YES;

            [self configureTiledLayer];

            [self setNeedsLayout];

        }

        return self;

    }

    - (void)configureTiledLayer {

        zoom = MIDDLE_FRE;

        moving = NO;

    - (void)setZoom:(CGFloat)newZoom {

        zoom = newZoom;

        self.transform = CGAffineTransformMakeScale(zoom,zoom);

    }

    - (void)zoomIn {

        [self setZoom:zoom * EXPAND_FRE];

    }

    - (void)zoomOut {

        [self setZoom:zoom * REDUCE_FRE];

    }

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

        [super touchesBegan:touches withEvent:event];

        touches = [event allTouches];

        if(touches.count >= 2)

        {

            NSArray *touches = [event.allTouches allObjects];

            CGPoint pointOne = [[touches objectAtIndex:0] previousLocationInView:self];

            CGPoint pointTwo = [[touches objectAtIndex:1] previousLocationInView:self];

            previousDistance = sqrt(pow(pointOne.x - pointTwo.x, 2.0f) +

                                    pow(pointOne.y - pointTwo.y, 2.0f));

        }

        else if(touches.count == 1)

        {

            previousPoint = [[touches anyObject] locationInView:self];

        }

    }

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

        [super touchesMoved:touches withEvent:event];

        if(touches.count == 1) {

            CGPoint currentPoint = [[touches anyObject] locationInView:self];

            previousPoint = [[touches anyObject] previousLocationInView:self];

            if (![NSStringFromCGPoint(currentPoint) isEqualToString:NSStringFromCGPoint(previousPoint)])

            {

                CGPoint delta = CGPointMake(currentPoint.x - previousPoint.x, currentPoint.y - previousPoint.y);

                self.center = CGPointMake(self.center.x + delta.x * zoom,

                                                  self.center.y + delta.y * zoom);

                previousPoint = currentPoint;

                NSLog(@"---------string == %@",NSStringFromCGRect(self.frame));

                moving = YES;

            }

           

        }

        else if (touches.count != 2)

        {

            return;

        }

        else if(touches.count == 2) {

            NSArray *touches = [event.allTouches allObjects];

            CGPoint pointOne = [[touches objectAtIndex:0] locationInView:self];

            CGPoint pointTwo = [[touches objectAtIndex:1] locationInView:self];

            CGFloat distance = sqrt(pow(pointOne.x - pointTwo.x, 2.0f) +

                                    pow(pointOne.y - pointTwo.y, 2.0f));

            CGFloat newZoom = 1;

            if (previousDistance != 0)

            {

                newZoom = fabs(zoom+(distance - previousDistance) / (previousDistance));

            }

            [self setZoom:newZoom];

            previousDistance = distance;

        }

    }

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

        if(!moving) {

            if(touches.count == 1) {

                if([[touches anyObject] tapCount] == 2) {

                    [NSObject cancelPreviousPerformRequestsWithTarget:self];

                    [self zoomOut];

                } else {

                    [self performSelector:@selector(zoomIn) withObject:nil afterDelay:0.25];

                }

            }

        } else {

            moving = NO;

        }

    }

    - (void)dealloc {

        [super dealloc];

    }

    @end

  • 相关阅读:
    [Project Euler] Problem 58
    [Project Euler] Problem 59 Decrption
    [Project Euler] Problem 57
    VS2010 + WinDDK 搭建驱动开发环境
    利用C++模板特性计算各整数类型的最大最小值
    虚表的那些事儿
    ModuleNotFoundError: No module named 'pip._vendor.six'
    OpenCVPython系列之单应性查找对象理论篇
    OpenCVPython系列之背景分离
    OpenCVPython系列之Shi—tomasi拐角检测器
  • 原文地址:https://www.cnblogs.com/zhwl/p/2852285.html
Copyright © 2020-2023  润新知