我已经使用Core Plot创建了一个图表,并尝试使用捏缩放功能。我希望夹点仅在x轴或y轴上工作。我通过在我放入的捏手势识别器中使用以下代码来完成此操作。
- (void)handlePinch:(UIPinchGestureRecognizer*)recognizer
{
//NSLog(@"We are pinching");
//This allows you to figure out which direction the pinch is occuring HORIZ or VERT
if (recognizer.state != UIGestureRecognizerStateCancelled) //If gesture is occuring
{
_startScale = 1.0f;
if (recognizer.numberOfTouches == 2) //With two fingers
{
CGPoint firstPoint = [recognizer locationOfTouch:0 inView:recognizer.view];
CGPoint secondPoint = [recognizer locationOfTouch:1 inView:recognizer.view];
CGFloat tangent = fabs(secondPoint.y - firstPoint.y) / (secondPoint.x - firstPoint.x);
CGFloat angle = fabs(tangent);
//NSLog(@"angle is %f", angle);
if (angle <= 0.2679491924f)
{
//NSLog(@"HORIZONTAL");
_zoomX = _startScale * recognizer.scale;
}
else if (angle >= 3.7320508076f)
{
//NSLog(@"VERTICAL");
_zoomY = startScale * recognizer.scale;
}
else
{
//NSLog(@"BOTH");
}
}
}
[self changePlotRange];
}
方法changePlotRange如下。
- (void)changePlotRange
{
CPTGraph *graph = _hostView.hostedGraph;
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(_Xmin * _zoomX) length:CPTDecimalFromCGFloat((_Xmax - _Xmin) * _zoomX)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromCGFloat(_Ymin * _zoomY) length:CPTDecimalFromCGFloat((_Ymax - _Ymin) * _zoomY)];
}
这很好用,我可以独立地在任一轴上放大和缩小。但是,当我再次开始捏合时,比例会跳回到1并且图形会反弹回原始比例,因此您需要再次缩放。我想让它像照片一样工作,捏一点,缩放一点,捏一些,图片从最后一个刻度缩放。
因此,在捏合手势中,我试图保持当前比例并稍后将其返回...
if (recognizer.state == UIGestureRecognizerStateEnded)
{
_startScale = _zoomX;
}
我把它放在handlePinch方法中。但它仍然可以追溯到一个规模。任何帮助都会受到赞赏,因为我在过去三天里搜索并尝试过很多东西。
答案 0 :(得分:1)
您需要分别保存x和y的结束缩放值,因为它们可能会有所不同。此外,请勿在手势识别器处理程序的开头重置开始比例 - 您希望它使用之前的缩放值。