我正在使用core-plot lib在我的应用中绘制条形图,如
我的问题是我只想在水平方向上启用grapgh运动,以便我可以长时间看到记录,但问题是我只是想保持y轴固定到它的位置,
我该怎么做?
等待帮助....
答案 0 :(得分:21)
如果您使用的是Core-Plot 0.2.2或更高版本(可能更早),那么您可以在绘图空间的委托上添加一个方法来处理以下内容:
-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement {
return CGPointMake(displacement.x, 0);
}
这会将绘图移动限制为仅水平。这假设您允许通过设置allowsUserInteraction = YES来与绘图空间进行交互。
答案 1 :(得分:14)
通过在绘图空间上设置委托(即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;
}
请参阅:CPPlotSpace.h
答案 2 :(得分:12)
我用一种简单的方法来“禁用”垂直滚动
CPPlotRange *globalYRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromDouble(minY) length:CPDecimalFromDouble(maxY)];
plotSpace.globalYRange = globalYRange;
对于,minY和maxY我把我显示的值,就像你看到的垂直限制一样,所以你不能垂直滚动
在我看到你的主题后,它对我有用,所以我想用我的
来完成你的答案答案 3 :(得分:10)
仅在最近才在核心图表图中启用了基本用户交互。要启用任何方向的滚动,可以将绘图空间的allowsUserInteraction
属性设置为YES。
我们目前无法将这种移动锁定到一个方向。滚动操作发生在CPXYPlotSpace上的-pointingDeviceDraggedAtPoint:
方法中,因此您可以继承CPXYPlotSpace,复制其方法的实现,并将其更改为仅允许在X方向上移动。更好的是,我们非常感谢任何扩展CPXYPlotSpace功能的贡献,以增加对单向移动的支持。
答案 4 :(得分:10)
使用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;
}
答案 5 :(得分:2)
所有你需要做的就是在答案4后用注释incl修复y轴。 (newRange.doublePrecisionLocation
现在newRange.locationDouble
)是设置plotSpace.globalYRange = plotSpace.yRange;
答案 6 :(得分:2)
我正在使用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轴的原始范围
答案 7 :(得分:1)
感谢supperAly
当我的界面实现“CPPlotSpaceDelegate”协议时
并且项目无法正常编译,并表明:
your interface xxx doesn't implement 'CPLineStyleDelegate' protocol
,这让我感到困惑。
所以我添加方法:-(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty }
对于CPLineStyleDelegate并将<CPLineStyleDelegate>
添加到我的界面,问题已经消失。
答案 8 :(得分:1)
以下代码基于Tom Donaldson's answer,并已使用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;
}
答案 9 :(得分:0)
您可以覆盖
-(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint`
在CPTXYPlotSpace中运行,并取出与y轴运动相关的所有代码。
答案 10 :(得分:0)