zoukankan      html  css  js  c++  java
  • 使用手势对UIImageView进行缩放、旋转和移动(转)

    原文地址:http://blog.csdn.net/crazy_frog/article/details/8664108

    // 添加所有的手势
    - (void) addGestureRecognizerToView:(UIView *)view
    {
        // 旋转手势
        UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateView:)];
        [view addGestureRecognizer:rotationGestureRecognizer];
        
        // 缩放手势
        UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
        [view addGestureRecognizer:pinchGestureRecognizer];
        
        // 移动手势
        UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
        [view addGestureRecognizer:panGestureRecognizer];
    }
    
    // 处理旋转手势
    - (void) rotateView:(UIRotationGestureRecognizer *)rotationGestureRecognizer
    {
        UIView *view = rotationGestureRecognizer.view;
        if (rotationGestureRecognizer.state == UIGestureRecognizerStateBegan || rotationGestureRecognizer.state == UIGestureRecognizerStateChanged) {
            view.transform = CGAffineTransformRotate(view.transform, rotationGestureRecognizer.rotation);
            [rotationGestureRecognizer setRotation:0];
        }
    }
    
    // 处理缩放手势
    - (void) pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
    {
        UIView *view = pinchGestureRecognizer.view;
        if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {
            view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);
            pinchGestureRecognizer.scale = 1;
        }
    }
    
    // 处理拖拉手势
    - (void) panView:(UIPanGestureRecognizer *)panGestureRecognizer
    {
        UIView *view = panGestureRecognizer.view;
        if (panGestureRecognizer.state == UIGestureRecognizerStateBegan || panGestureRecognizer.state == UIGestureRecognizerStateChanged) {
            CGPoint translation = [panGestureRecognizer translationInView:view.superview];
            [view setCenter:(CGPoint){view.center.x + translation.x, view.center.y + translation.y}];
            [panGestureRecognizer setTranslation:CGPointZero inView:view.superview];
        }
    }

    这样只需要简单调用

    [self addGestureRecognizerToView:view];  
     
    //如果处理的是图片,别忘了
    [imageView setUserInteractionEnabled:YES];  
    [imageView setMultipleTouchEnabled:YES]; 

    具体使用一下:

    在.h文件里边定义变量

    @interface YourViewController : UIViewController<UIGestureRecognizerDelegate>
    {
        CGFloat lastScale;
        CGRect oldFrame;    //保存图片原来的大小
        CGRect largeFrame;  //确定图片放大最大的程度
    }

    然后在viewDidLoad里面加上

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        showImgView = [[UIImageView alloc] initWithFrame:<span class="s1">CGRectMake</span>(<span class="s2">0</span>, <span class="s2">0</span>, 320, 480)];
        [showImgView setMultipleTouchEnabled:YES];
        [showImgView setUserInteractionEnabled:YES];
        [showImgView setImage:[UIImage imageNamed:@"1.jpg"]];
        
        oldFrame = showImgView.frame;
        largeFrame = CGRectMake(0 - screenSize.width, 0 - screenSize.height, 3 * oldFrame.size.width, 3 * oldFrame.size.height);
        
        [self addGestureRecognizerToView:showImgView];
        [self.view addSubview:showImgView];

    这样就实现了

    但是,这样是不够的。

    因为里边的缩放和移动等没有做相应的判断。

    因为代码很简洁,所以扩展也非常方便。

    我修改了缩放的代码,增加了限制,其他的类似

    // 处理缩放手势
    - (void) pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
    {
        UIView *view = pinchGestureRecognizer.view;
        if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {
            view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);
            if (showImgView.frame.size.width < oldFrame.size.width) {
                showImgView.frame = oldFrame;
                //让图片无法缩得比原图小
            }
            if (showImgView.frame.size.width > 3 * oldFrame.size.width) {
                showImgView.frame = largeFrame;
            }
            pinchGestureRecognizer.scale = 1;
        }
    }

    这样就保证了图片的最大和最小比例。

  • 相关阅读:
    Oracle 修改带数据的字段类型
    Oracle的主键约束、唯一约束与外键约束
    Oracle 唯一 索引 约束 创建 删除
    Oracle 在Drop表时的Cascade Constraints
    iTunes备份注意
    谈判的四种风格
    求平均速度
    网站推荐的代码自动生成软件实际使用感触
    DOTA游戏相关的文章
    魔兽争霸3不能弹出输入法原因
  • 原文地址:https://www.cnblogs.com/xiaobaizhu/p/3141961.html
Copyright © 2011-2022 走看看