2012-02-29 21 views
4

をスクロール、yはスケーリングを軸無効にすると、私コアプロットは、私はこのようなものにしたい

//viewDidLoad 
//plotSpace.delegate = self; 

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space 
    willChangePlotRangeTo:(CPTPlotRange *)newRange 
      forCoordinate:(CPTCoordinate)coordinate { 

    NSLog(@"WillChangePlotRangeTo"); 

    // only allows scrolling to the right 
    // remove this to have scrolling in both directions 
    if (newRange.locationDouble < 0.0F) { 
     newRange.location = CPTDecimalFromFloat(0.0); 
    } 

    // Adjust axis to keep them in view at the left and bottom; 
    // adjust scale-labels to match the scroll. 
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
    if (coordinate == CPTCoordinateX) { 
     axisSet.yAxis.orthogonalCoordinateDecimal = newRange.location; 
     axisSet.xAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble + 
                 (newRange.lengthDouble/2.0F)); 
    } else { 
     axisSet.xAxis.orthogonalCoordinateDecimal = newRange.location; 
     axisSet.yAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble + 
                 (newRange.lengthDouble/2.0F)); 
    } 

    return newRange; 
} 

を、私はこれをしようと、このソリューションは動作しますズームアウトではなく、私はに拡大すると動作します。

plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(3.0)]; 
plotSpace.globalYRange = plotSpace.yRange; 

誰が正しい結果、そしてどのようにその仕事実際には何か、私に説明してください。

感謝の返信

答えて

12

最も簡単な方法は、ちょうどnewRangeを無視し、y座標のための既存のyRangeを返すことです。ここで軸のプロパティを更新することを煩わす必要はありません。それを行う簡単な方法があります。

グラフの設定:

// leave the titleLocation for both axes at the default (NAN) to center the titles 
xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; 
yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; 

プロットスペースのデリゲート:

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space 
     willChangePlotRangeTo:(CPTPlotRange *)newRange 
       forCoordinate:(CPTCoordinate)coordinate { 

    CPTPlotRange *updatedRange = nil; 

    switch (coordinate) { 
    case CPTCoordinateX: 
     if (newRange.locationDouble < 0.0F) { 
      CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease]; 
      mutableRange.location = CPTDecimalFromFloat(0.0); 
      updatedRange = mutableRange; 
     } 
     else { 
      updatedRange = newRange; 
     } 
     break; 
    case CPTCoordinateY: 
     updatedRange = ((CPTXYPlotSpace *)space).yRange; 
     break; 
    } 
    return updatedRange; 
} 
+0

パーフェクトな答えが働いています、非常に大変ありがとう、1つしかありません。このメッセージでアプリケーションのクラッシュを大きく外すと、次のようになります。 - [CPTPlotRange mutableCopyWithZone:]:認識できないセレクタがインスタンスに送信されました0xd876030 2012-03-01 07:41:58.676 SSDev [823:11f03] ***キャッチされていない例外 'NSInvalidArgumentException'によりアプリを終了しています、理由: ' - [CPTPlotRange mutableCopyWithZone :]:インスタンスに送信された認識できないセレクタ0xd876030 ' ***最初のコールスタックをスローする: – flatronka

1

私は似たような状況や問題を抱えていたと私は、デリゲートを設定するのを忘れたので、それは狂気私を運転した:

plotSpace.delegate = self; 
関連する問題