このようにアプリで棒グラフを描画するためにcore-plot libを使用しています
私の問題は、グラフの移動を水平方向にのみ有効にして、レコードを長期間表示できるようにしたいことですが、問題は、y 軸をその場所に固定したままにしたくないことです。
これどうやってするの?
助けを待っています....
Core-Plot 0.2.2 以降 (おそらくそれ以前) を使用している場合は、プロット スペースのデリゲートにメソッドを追加して、以下を処理できます。
-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement {
return CGPointMake(displacement.x, 0);
}
これにより、プロットの移動が水平方向のみに制限されます。これは、allowsUserInteraction = YES を設定して、プロット スペースとの対話を許可したことを前提としています。
プロット スペースにデリゲート (つまり、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
垂直スクロールを「無効にする」簡単な方法を使用しました
CPPlotRange *globalYRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromDouble(minY) length:CPDecimalFromDouble(maxY)];
plotSpace.globalYRange = globalYRange;
minY と maxY については、表示した値を入力します。垂直方向の制限が表示されるように、垂直方向のスクロールはできません
あなたのトピックを見た後、それは私のために働いたので、私はあなたの答えを私のもので完成させたかったのです
Core Plot グラフで基本的なユーザー操作が有効になったのはごく最近のことです。任意の方向へのスクロールを有効にするにallowsUserInteraction
は、プロット スペースのプロパティを YES に設定します。
現在、その動きを一方向にロックする手段はありません。スクロール アクションは-pointingDeviceDraggedAtPoint:
CPXYPlotSpace のメソッドで発生するため、CPXYPlotSpace をサブクラス化し、そのメソッドの実装をコピーして、X 方向の移動のみを許可するように変更できます。さらに良いことに、単方向移動のサポートを追加するために CPXYPlotSpace の機能を拡張するための貢献に感謝します。
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;
}
回答4の後にコメント付きでy軸を修正するために必要なことはすべてです。(newRange.doublePrecisionLocation
今newRange.locationDouble
)は設定することですplotSpace.globalYRange = plotSpace.yRange;
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 軸の元の範囲を維持します
次のコードは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;
}
あなたはオーバーライドすることができます
-(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint`
CPTXYPlotSpaceで機能し、y軸の動きに関連するすべてのコードを取り出します。
@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 を使用しました。