iOS 中无法缩放核心图
Trouble pinch zooming core plot graph in iOS
我已经使用 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,图形会弹回原始比例,因此您需要再次缩放。我希望它像图片一样工作,捏一点,放大一点,再捏一点,图片从最后一个比例缩放。
因此,在捏合手势中,我尝试保持当前比例并 return 稍后使用...
if (recognizer.state == UIGestureRecognizerStateEnded)
{
_startScale = _zoomX;
}
我把它放在 handlePinch 方法中。但它仍然回到了一个规模。任何帮助将不胜感激,因为我在过去三天里搜索并尝试了很多东西。
您需要分别保存 x 和 y 的结束缩放值,因为它们可能不同。此外,不要在手势识别器处理程序的开头重置起始比例——您希望它使用以前的缩放值。
我已经使用 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,图形会弹回原始比例,因此您需要再次缩放。我希望它像图片一样工作,捏一点,放大一点,再捏一点,图片从最后一个比例缩放。
因此,在捏合手势中,我尝试保持当前比例并 return 稍后使用...
if (recognizer.state == UIGestureRecognizerStateEnded)
{
_startScale = _zoomX;
}
我把它放在 handlePinch 方法中。但它仍然回到了一个规模。任何帮助将不胜感激,因为我在过去三天里搜索并尝试了很多东西。
您需要分别保存 x 和 y 的结束缩放值,因为它们可能不同。此外,不要在手势识别器处理程序的开头重置起始比例——您希望它使用以前的缩放值。