仅在核心图条形图中允许水平滚动?

时间:2009-12-12 06:18:40

标签: iphone cocoa-touch core-graphics core-plot bar-chart

我正在使用core-plot lib在我的应用中绘制条形图,如......

我的问题是我只想在水平方向上启用grapgh运动,以便我可以长时间看到记录,但问题是我只是想保持y轴固定到它的位置,

我该怎么做?

等待帮助....

11 个答案:

答案 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)