代码之家  ›  专栏  ›  技术社区  ›  Jim Rhodes

在夹点期间限制平移以缩放iOS

  •  0
  • Jim Rhodes  · 技术社区  · 6 年前

    在我的应用程序中,我已经实现了缩放和平移。缩放和平移都有效,但我想限制平移,以便缩放图像的边缘不能拖到视图中留下空白。

    不同比例因子的坐标范围似乎不是线性的。例如,在具有764x764图像视图的iPad上,在2x变焦下,全平移的变换X坐标范围是-191到191。在3倍,范围大约是-254到254。

    所以我的问题是,如何计算给定比例因子的泛极限?

    这是我的手势识别器代码:

    @interface myVC()
    {
      CGPoint ptPanZoom1;
      CGPoint ptPanZoom2;
      CGFloat fltScale;
    }
    @property (nonatomic, strong) UIImageView* imgView; // View hosting pan/zoom image
    @end
    
    - (IBAction) handlePan:(UIPanGestureRecognizer*) sender
    {
      if ( sender.state == UIGestureRecognizerStateBegan )
      {
        ptPanZoom2 = ptPanZoom1;
        return;
      }
    
      if ( (sender.state == UIGestureRecognizerStateChanged)
        || (sender.state == UIGestureRecognizerStateEnded) )
      {
        CGPoint ptTrans = [sender translationInView:self.imgView];
    
        ptPanZoom1.x = ptTrans.x + ptPanZoom2.x;
        ptPanZoom1.y = ptTrans.y + ptPanZoom2.y;
    
        CGAffineTransform trnsFrm1 = CGAffineTransformMakeTranslation(ptPanZoom1.x, ptPanZoom1.y);
        CGAffineTransform trnsFrm2 = CGAffineTransformMakeScale(fltScale, fltScale);
        self.imgView.transform = CGAffineTransformConcat(trnsFrm1, trnsFrm2);
      }
    }
    
    - (IBAction) handlePinch:(UIPinchGestureRecognizer*) sender
    {
      if ( (sender.state == UIGestureRecognizerStateBegan)
        || (sender.state == UIGestureRecognizerStateChanged)
        || (sender.state == UIGestureRecognizerStateEnded) )
      {
        fltScale *= sender.scale;
        sender.scale = 1.0;
    
        if ( fltScale <= 1.0 )
        {
          fltScale = 1.0;
          ptPanZoom1.x  = 0.0; // When scale goes to 1, snap position back
          ptPanZoom1.y  = 0.0;
        }
        else if ( fltScale > 6.0 )
        {
          fltScale = 6.0;
        }
    
        CGAffineTransform trnsFrm1 = CGAffineTransformMakeTranslation(ptPanZoom1.x, ptPanZoom1.y);
        CGAffineTransform trnsFrm2 = CGAffineTransformMakeScale(fltScale, fltScale);
        self.imgView.transform = CGAffineTransformConcat(trnsFrm1, trnsFrm2);
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Jim Rhodes    6 年前

    我计算出了确定泛程极限的方程式:

    int iMaxPanX = ((self.imgView.bounds.size.width * (fltScale - 1.0)) / fltScale) / 2;
    int iMinPanX = -iMaxPanX;
    int iMaxPanY = ((self.imgView.bounds.size.height * (fltScale - 1.0)) / fltScale) / 2;
    int iMinPanY = -iMaxPanY;
    

    在我的pan手势处理程序中,我允许pan在更改事件期间稍微超出限制,这样用户就可以很容易地看到它们已经到达了边缘。