zoukankan      html  css  js  c++  java
  • 用UIScrollView做一个支持两点触控缩放图片

    ViewController.h:

    #import <UIKit/UIKit.h>

    @interface ViewController : UIViewController<UIGestureRecognizerDelegate> {
        float distStart,distEnd,scale;
        UIScrollView *scrollView;
        UIImage *image;
        UIImageView *imageView;
    }

    @end

    ViewController.m:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //
        scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake((self.view.bounds.origin.x), self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height)];
       
        [self.view addSubview:scrollView];

        image = [UIImage imageNamed:@"img.jpg"];
        imageView = [[UIImageView alloc]initWithImage:image];
        scrollView.contentSize = imageView.bounds.size;
        [scrollView addSubview:imageView];
        [scrollView setBackgroundColor:[UIColor blueColor]];
       
        UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc]
                                                    
                                                     initWithTarget:self action:@selector(scale:)];
        [pinchRecognizer setDelegate:self];
        [self.view addGestureRecognizer:pinchRecognizer];
        [pinchRecognizer release];
    }

    -(void)scale:(id)sender {
        UIPinchGestureRecognizer* ges = (UIPinchGestureRecognizer*)sender;

        int touchCount = ges.numberOfTouches;
        if (touchCount == 2) {
            if ([ges state] == UIGestureRecognizerStateBegan) {
                CGPoint p1 = [ges locationOfTouch:0 inView:self.view];
                CGPoint p2 = [ges locationOfTouch:1 inView:self.view];
                distStart = [self distanceFromPointX:p1 distanceToPointY:p2];

            } else if ([ges state] == UIGestureRecognizerStateEnded) {
                CGPoint p1 = [ges locationOfTouch:0 inView:self.view];
                CGPoint p2 = [ges locationOfTouch:1 inView:self.view];
                distEnd = [self distanceFromPointX:p1 distanceToPointY:p2];
               
                scale = distEnd / distStart;

                float newWidth = imageView.bounds.size.width * scale;           
                float newHeight = imageView.bounds.size.height * scale;
                if (newWidth < self.view.bounds.size.width) {
                    newWidth = self.view.bounds.size.width;
                    newHeight = imageView.bounds.size.height/imageView.bounds.size.width * newWidth;
                }
               
                if (newHeight < self.view.bounds.size.height) {
                    newHeight = self.view.bounds.size.height;
                    newWidth = imageView.bounds.size.width/imageView.bounds.size.height * newHeight;
                }
                [imageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];

                scrollView.contentSize = imageView.bounds.size;
                [scrollView setFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
            }       
        }
    }

    -(float)distanceFromPointX:(CGPoint)start distanceToPointY:(CGPoint)end{   
        float distance;   
        CGFloat xDist = (end.x - start.x);   
        CGFloat yDist = (end.y - start.y);   
        distance = sqrt((xDist * xDist) + (yDist * yDist));   
        return distance;   
    }

    还有一种实现方式,代码如下:

    -(void)scale:(id)sender {
        UIPinchGestureRecognizer* gues = (UIPinchGestureRecognizer*)sender;
        [self.view bringSubviewToFront:[gues view]];
       
        //当手指离开屏幕时,将lastscale设置为1.0
        if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
            lastScale = 1.0;
            return;
        }
       
        CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);
        CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
        CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
       
       
        [[gues view] setTransform:newTransform]; 
       
       
        lastScale = [(UIPinchGestureRecognizer*)sender scale];   
        CGRect bnds = CGRectApplyAffineTransform(gues.view.bounds, newTransform);
        [sv setContentSize:bnds.size];
        [iv setFrame:bnds];   
    }

  • 相关阅读:
    关于++i和i++的左值、右值问题
    运算符优先级
    计算机中的数及其编码
    递归函数
    PHP读取excel(4)
    替换元素节点replaceChild()
    子结点childNodes
    插入节点insertBefore()
    创建节点createElement
    插入节点appendChild()
  • 原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/2687556.html
Copyright © 2011-2022 走看看