我正在使用 core-plot lib 在我的应用程序中绘制条形图,如下所示
我的问题是我希望仅在水平方向上启用 grapgh 移动,以便我可以长时间查看记录,但问题是我只是不想将 y 轴固定在其位置,
我怎样才能做到这一点?
等待帮助....
如果您使用的是 Core-Plot 0.2.2 或更高版本(可能更早),那么您可以在绘图空间的委托上添加一个方法来处理以下内容:
-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement {
return CGPointMake(displacement.x, 0);
}
这会将绘图移动限制为仅水平方向。这假设您已通过设置allowUserInteraction = YES 来允许与绘图空间进行交互。
通过在绘图空间上设置一个委托(即 CPPlotSpaceDelegate)来限制滚动并实现 willChangePlotRangeTo 方法。你可以同时做其他很酷的事情。以下是我如何将显示限制在第一象限:
- (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;
}
参见:CPlotSpace.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——为了将滚动限制为水平和缩放,我实现了两个 CPTPlotSpaceDelegate 方法:Steve Tranby 的方法和 supperAly/edo42 建议的修改方法。
-(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轴的原始范围
感谢 supperAly,当我的接口实现“CPPlotSpaceDelegate”协议并且项目无法正常编译时,并显示:
your interface xxx doesn't implement 'CPLineStyleDelegate' protocol
,这让我感到困惑。所以我添加了方法:-(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty }
对于 CPLineStyleDelegate 并添加<CPLineStyleDelegate>
到我的界面中,问题就消失了。
以下代码基于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”示例,在 plotSpace:willChangePlotRangeTo:forCoordinate: ...
CPTMutablePlotRange *changedRange = [newRange mutableCopy];
changedRange.location = CPTDecimalFromCGFloat(0.0F); 然后通过集合,我在 if...else 块中使用了 changedRange。