在捏时限制平移以在iOS上缩放

时间:2018-08-09 13:18:16

标签: ios objective-c

在我的应用中,我已经实现了捏缩放和平移。缩放和平移都可以,但是我想限制平移,以使缩放图像的边缘不能拖到视图中,从而留出空白空间。

不同比例因子的坐标范围似乎不是线性的。例如,在图像视图为764x764的iPad上,以2倍缩放时,全幅和平移的X坐标的范围是-191至191。在3x时,范围是-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 个答案:

答案 0 :(得分:0)

我想出了确定声像限的公式:

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;

在我的平移手势处理程序中,我允许平移在发生更改的事件期间略微超出限制,以便用户可以轻松看到它们已经到达边缘。