9

我正在使用 core-plot lib 在我的应用程序中绘制条形图,如下所示……

我的问题是我希望仅在水平方向上启用 grapgh 移动,以便我可以长时间查看记录,但问题是我只是不想将 y 轴固定在其位置,

我怎样才能做到这一点?

等待帮助....

4

11 回答 11

22

如果您使用的是 Core-Plot 0.2.2 或更高版本(可能更早),那么您可以在绘图空间的委托上添加一个方法来处理以下内容:

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

这会将绘图移动限制为仅水平方向。这假设您已通过设置allowUserInteraction = YES 来允许与绘图空间进行交互。

于 2010-12-29T23:42:30.573 回答
16

通过在绘图空间上设置一个委托(即 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

于 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——为了将滚动限制为水平和缩放,我实现了两个 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;
}
于 2012-03-15T14:25:01.060 回答
3

在回答 4 之后,您需要做的就是修复 y 轴,并附上注释。(newRange.doublePrecisionLocation现在newRange.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

感谢 supperAly,当我的接口实现“CPPlotSpaceDelegate”协议并且项目无法正常编译时,并显示: your interface xxx doesn't implement 'CPLineStyleDelegate' protocol,这让我感到困惑。所以我添加了方法:-(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty } 对于 CPLineStyleDelegate 并添加<CPLineStyleDelegate>到我的界面中,问题就消失了。

于 2011-04-27T07:40:24.747 回答
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”示例,在 plotSpace:willChangePlotRangeTo:forCoordinate: ...

CPTMutablePlotRange *changedRange = [newRange mutableCopy];

changedRange.location = CPTDecimalFromCGFloat(0.0F); 然后通过集合,我在 if...else 块中使用了 changedRange。

于 2013-04-14T02:07:49.990 回答