Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制挤压期间的平移以在iOS上缩放_Ios_Objective C - Fatal编程技术网

限制挤压期间的平移以在iOS上缩放

限制挤压期间的平移以在iOS上缩放,ios,objective-c,Ios,Objective C,在我的应用程序中,我实现了收缩缩放和平移。缩放和平移都在工作,但我想限制平移,以便缩放图像的边缘不能拖到视图中留下空白 不同比例因子的坐标范围似乎不是线性的。例如,在图像视图为764x764的iPad上,在2倍缩放时,整个平移的变换X坐标范围为-191到191。在3倍时,范围约为-254到254 所以我的问题是,我如何计算任何给定比例因子的泛极限 以下是我的手势识别器代码: @interface myVC() { CGPoint ptPanZoom1; CGPoint ptPanZoom

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

不同比例因子的坐标范围似乎不是线性的。例如,在图像视图为764x764的iPad上,在2倍缩放时,整个平移的变换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);
  }
}
@interface myVC()
{
cgpantpanzoom1;
CGPoint ptPanZoom2;
CGFLTSCALE;
}
@属性(非原子,强)UIImageView*imgView;//查看宿主平移/缩放图像
@结束
-(iAction)handlePan:(UIPangestureRecognitor*)发送方
{
if(sender.state==UIgestureRecognitizerStateStart)
{
ptPanZoom2=ptPanZoom1;
返回;
}
if((sender.state==UIGestureRecognitzerStateChanged)
||(sender.state==UIGestureRecognitzerStateEnded))
{
CGPoint-ptTrans=[sender-translationview:self.imgView];
ptPanZoom1.x=ptTrans.x+ptPanZoom2.x;
ptPanZoom1.y=ptTrans.y+ptPanZoom2.y;
CGAffineTransform trnsFrm1=CGAffineTransformMakeTransform(ptPanZoom1.x,ptPanZoom1.y);
CGAffineTransform trnsFrm2=CGAffineTransformMakeScale(fltScale,fltScale);
self.imgView.transform=cGraffinetTransformConcat(trnsFrm1,trnsFrm2);
}
}
-(iAction)handlePinch:(UIPinch检测识别器*)发送器
{
if((sender.state==UIgestureRecognitizerStateStart)
||(sender.state==UIGestureRecognizerStateChanged)
||(sender.state==UIGestureRecognitzerStateEnded))
{
fltScale*=发送器刻度;
sender.scale=1.0;
如果(fltScale 6.0)
{
fltScale=6.0;
}
CGAffineTransform trnsFrm1=CGAffineTransformMakeTransform(ptPanZoom1.x,ptPanZoom1.y);
CGAffineTransform trnsFrm2=CGAffineTransformMakeScale(fltScale,fltScale);
self.imgView.transform=cGraffinetTransformConcat(trnsFrm1,trnsFrm2);
}
}

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

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在更改事件期间稍微超出限制,以便用户可以轻松看到他们已到达边缘