2012-07-19 227 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; 



}