2012-07-19 100 views
2

我使用下面的代码沿着X轴Y轴和缩放滚动我的核心图。它的工作正常。但是当我放大我的核心情节时,它会放大两个方向。如果我沿x方向捏住,我想让图形沿X缩放,如果沿着Y方向捏住,则缩放Y.请有人可以帮我解决这个问题。沿Y轴和X轴缩放核心图独立

-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement 
{ 
    return CGPointMake(displacement.x, displacement.y); 
} 

-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate 
{                                                           
    // Adjust axis to keep them in view at the left and bottom; 
    // adjust scale-labels to match the scroll. 

    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.hostView.hostedGraph.axisSet; 
    if (coordinate == CPTCoordinateX) { 
     axisSet.yAxis.orthogonalCoordinateDecimal = newRange.location; 
    } 

    else { 
     axisSet.yAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble +             (newRange.lengthDouble/2.0F)); 
    } 

    return newRange; 
} 
+0

虽然我确实感到困惑,你希望发生的事情,如果你只在一个放大什么阅读本http://stackoverflow.com/q/3559577/1487063 – Dustin 2012-07-19 18:52:11

+0

方向......你会改变比率吗?这不是真的缩放,你可能需要重绘。 – Dustin 2012-07-19 18:54:19

+0

是否有可能没有使用pinchgesture作为核心阴谋本身允许检测捏 – Kashyap 2012-07-19 18:55:28

回答

1

保持轴和标题在正确的位置,最简单的方法是使用axisConstraints用于轴与离开titleLocation在它的NAN的默认。这将减轻您的代表更新这些项目的责任,您可以专注于缩放。

在这两种代表方法中,您只需要-plotSpace:willChangePlotRangeTo:forCoordinate:。另一个只在滚动时调用。

决定是否允许缩放发生在x或y(请参阅原始问题的评论中的链接)。检查委托方法中的coordinate参数;返回newRange以允许缩放发生或[space plotRangeForCoordinate:coordinate]恢复原始范围并防止缩放。

如果您需要使用您自己的手势识别器来检测夹角,请在主机视图上将allowPinchScaling设置为NO以禁用内置识别器。将您自己的识别器添加到托管视图。在处理程序方法中,决定要缩放哪个轴(如果有)并相应地调整适当的绘图范围。如果你这样做,你根本不需要剧情空间委托。

+0

我希望缩放既在X和Y中发生,也是独立的,这意味着如果我沿x轴捏住x轴必须缩放,酒吧的高度必须增加。 – Kashyap 2012-07-20 15:15:26

0

我正在使用UIPinchGestureRecognizer计算X和Y坐标的变化,然后确定绘图范围应该改变的方向(X或Y)。它的工作正常,但它不像普通的变焦一样平滑,而且响应时间较晚。有人建议我一个更好的办法来做到这一点

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer{ 
     if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){ 

     CGPoint translation = [gestureRecognizer locationInView:hostView]; 
     NSLog(@"Sender value %f %f", translation.x,translation.y); 
     initialX = translation.x; 
     initialY = translation.y;   
     return; 
} 
else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){ 
       NSLog(@"inside else"); 
     CGPoint currentTouchLocation = [gestureRecognizer locationInView:hostView]; 
     NSLog(@"currentTouchLocation = %f and %f and ",currentTouchLocation.x, currentTouchLocation.y); 
      finalX = currentTouchLocation.x; 
      finalY = currentTouchLocation.y; 
        } 
} 
-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate 
{ 
    float x = fabsf(finalX - initialX) ; 
    float y = fabsf(finalY - initialY); 
    NSLog(@"pinch x = %f pinch y = %f", x, y); 
     CPTPlotRange *updatedRange = nil; 

    if (x > y) { 
     switch (coordinate) { 
      case CPTCoordinateX: 
       NSLog(@"x is greater than y change x-range"); 

       if (newRange.locationDouble < 0.0F) { 
        CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease]; 
        mutableRange.location = CPTDecimalFromFloat(0.0); 
        updatedRange = mutableRange; 
       } 
       else { 
        updatedRange = newRange; 
       } 
       break; 
      case CPTCoordinateY: 
       NSLog(@"x is greater than y keep y range constant"); 

       updatedRange = ((CPTXYPlotSpace *)space).yRange; 
       break; 

     } 

      } 

    if (x < y) { 
     switch (coordinate) { 
      case CPTCoordinateX: 
       NSLog(@"y is greater than x keep x-range constant"); 

       updatedRange = ((CPTXYPlotSpace *)space).xRange; 
           break; 
      case CPTCoordinateY: 
       if (newRange.locationDouble < 0.0F) { 
        NSLog(@"y is greater than x increase y range"); 
        CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease]; 
        // mutableRange.location = CPTDecimalFromFloat(0.0); 
        updatedRange = mutableRange; 
       } 
       else { 
        updatedRange = newRange; 
       } 

       break; 

     } 

    } 
    if (x == y) { 
     switch (coordinate) { 
      case CPTCoordinateX: 
       NSLog(@"y is equal to x keep x-range constant"); 
       updatedRange = ((CPTXYPlotSpace *)space).xRange; 
       break; 
      case CPTCoordinateY: 
       NSLog(@"y is equal to x keep y-range constant"); 
       //NSLog(@"%d", CPTCoordinateY); 
       updatedRange = ((CPTXYPlotSpace *)space).yRange; 
       break; 

     } 

    } 



     return updatedRange; 



}