9

このようにアプリで棒グラフを描画するためにcore-plot libを使用しています……

私の問題は、グラフの移動を水平方向にのみ有効にして、レコードを長期間表示できるようにしたいことですが、問題は、y 軸をその場所に固定したままにしたくないことです。

これどうやってするの?

助けを待っています....

4

11 に答える 11

22

Core-Plot 0.2.2 以降 (おそらくそれ以前) を使用している場合は、プロット スペースのデリゲートにメソッドを追加して、以下を処理できます。

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

これにより、プロットの移動が水平方向のみに制限されます。これは、allowsUserInteraction = YES を設定して、プロット スペースとの対話を許可したことを前提としています。

于 2010-12-29T23:42:30.573 に答える
16

プロット スペースにデリゲート (つまり、CPPlotSpaceDelegate) を設定してスクロールを制限し、willChangePlotRangeTo メソッドを実装します。同時に他のクールなこともできます。表示を象限1に制限する方法は次のとおりです。

- (CPPlotRange *)plotSpace:(CPPlotSpace *)space
    willChangePlotRangeTo:(CPPlotRange *)newRange
            forCoordinate:(CPCoordinate)coordinate {

    // Display only Quadrant I: never let the location go negative.
    //
    if (newRange.locationDouble < 0.0F) {
        newRange.location = CPDecimalFromFloat(0.0);
    }

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

    return newRange;
}

参照: CPPlotSpace.h

于 2010-04-05T19:28:40.530 に答える
13

垂直スクロールを「無効にする」簡単な方法を使用しました

    CPPlotRange *globalYRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromDouble(minY) length:CPDecimalFromDouble(maxY)];
    plotSpace.globalYRange = globalYRange;

minY と maxY については、表示した値を入力します。垂直方向の制限が表示されるように、垂直方向のスクロールはできません

あなたのトピックを見た後、それは私のために働いたので、私はあなたの答えを私のもので完成させたかったのです

于 2011-01-03T13:58:16.340 に答える
11

Core Plot グラフで基本的なユーザー操作が有効になったのはごく最近のことです。任意の方向へのスクロールを有効にするにallowsUserInteractionは、プロット スペースのプロパティを YES に設定します。

現在、その動きを一方向にロックする手段はありません。スクロール アクションは-pointingDeviceDraggedAtPoint:CPXYPlotSpace のメソッドで発生するため、CPXYPlotSpace をサブクラス化し、そのメソッドの実装をコピーして、X 方向の移動のみを許可するように変更できます。さらに良いことに、単方向移動のサポートを追加するために CPXYPlotSpace の機能を拡張するための貢献に感謝します。

于 2009-12-12T16:10:23.827 に答える
11

CorePlot 1.0 を使用 -- スクロールを水平方向とスケーリングのみに制限するために、2 つの CPTPlotSpaceDelegate メソッドを実装しました。

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

-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate
{
    if (coordinate == CPTCoordinateY) {
    newRange = ((CPTXYPlotSpace*)space).yRange;
    }
    return newRange;
}
于 2012-03-15T14:25:01.060 に答える
3

回答4の後にコメント付きでy軸を修正するために必要なことはすべてです。(newRange.doublePrecisionLocationnewRange.locationDouble)は設定することですplotSpace.globalYRange = plotSpace.yRange;

于 2010-09-10T05:35:21.457 に答える
3

CorePlot 0.2.2 を使用しています

-(CPPlotRange *)plotSpace:(CPPlotSpace *)space willChangePlotRangeTo:(CPPlotRange *)newRange forCoordinate:(CPCoordinate)coordinate;
{
    CPXYPlotSpace * plot_space = (CPXYPlotSpace*)space;
    plot_space.globalYRange = plot_space.yRange;
    return newRange;
}

CPPlotSpaceDelegate、CPLineStyleDelegate プロトコルをコントローラーに追加する必要があります。

および追加 (CPLineStyleDelegate 用)

-(void)lineStyleDidChange:(CPLineStyle *)lineStyle
{
//empty
}

システムは y 軸の元の範囲を維持します

于 2011-01-24T12:32:20.597 に答える
2

次のコードはTom Donaldson の回答に基づいており、CorePlot 1.5.1 でテストされています。

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space
      willChangePlotRangeTo:(CPTPlotRange *)newRange
              forCoordinate:(CPTCoordinate)coordinate
{
    CPTMutablePlotRange *range = [CPTMutablePlotRange plotRangeWithLocation:newRange.location length:newRange.length];

    // Display only Quadrant I: never let the location go negative.
    //
    if (range.locationDouble < 0.0F)
    {
        range.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 *) space.graph.axisSet;
    if (coordinate == CPTCoordinateX)
    {
        axisSet.yAxis.orthogonalCoordinateDecimal = range.location;
        axisSet.xAxis.titleLocation               = CPTDecimalFromDouble(range.locationDouble + (range.lengthDouble / 2.0F));
    }
    else
    {
        axisSet.xAxis.orthogonalCoordinateDecimal = range.location;
        axisSet.yAxis.titleLocation               = CPTDecimalFromDouble(range.locationDouble + (range.lengthDouble / 2.0F));
    }

    return range;
}
于 2014-07-02T07:46:18.223 に答える
0

あなたはオーバーライドすることができます

-(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint`

CPTXYPlotSpaceで機能し、y軸の動きに関連するすべてのコードを取り出します。

于 2011-09-19T20:55:29.340 に答える
0

@Andrew S: 「newRange.location = CPTDecimalFromFloat(0.0); で「読み取り専用プロパティへの割り当て」を取得しています。」

私もそれを持っていて、Core-Plot ギャラリー アプリの「CurvedScatterPlot」の例に従って、newRange の変更可能なコピーを plotSpace:willChangePlotRangeTo:forCoordinate: ... で使用しました。

CPTMutablePlotRange *changedRange = [newRange mutableCopy];

changedRange.location = CPTDecimalFromCGFloat(0.0F); その後、muster を渡し、if...else ブロックで changedRange を使用しました。

于 2013-04-14T02:07:49.990 に答える