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

Mad*_*dav 8 iphone cocoa-touch core-graphics bar-chart core-plot

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

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

我怎样才能做到这一点?

等待帮助....

Ste*_*nby 22

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

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

这会将绘图移动限制为仅水平.这假设您通过设置allowsUserInteraction = YES允许与绘图空间进行交互.


小智 15

通过在绘图空间上设置委托(即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;
}
Run Code Online (Sandbox Code Playgroud)

请参阅:CPPlotSpace.h

  • newRange.doublePrecisionLocation现在是newRange.locationDouble (3认同)
  • 我正在获取只读属性的赋值:newRange.location = CPTDecimalFromFloat(0.0); (2认同)

小智 12

我用一种简单的方法来"禁用"垂直滚动

    CPPlotRange *globalYRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromDouble(minY) length:CPDecimalFromDouble(maxY)];
    plotSpace.globalYRange = globalYRange;
Run Code Online (Sandbox Code Playgroud)

对于,minY和maxY我把我显示的值,就像你看到的垂直限制,所以你不能垂直滚动

在看到你的主题后,它对我有用,所以我想用我的方式完成你的答案


Bra*_*son 10

直到最近才在Core Plot图中启用了基本的用户交互.要启用任何方向的滚动,可以将allowsUserInteraction绘图空间的属性设置为YES.

我们目前无法将这种运动锁定到一个方向.滚动操作发生在-pointingDeviceDraggedAtPoint:CPXYPlotSpace上的方法中,因此您可以子类化CPXYPlotSpace,复制其方法的实现,并将其更改为仅允许在X方向上移动.更好的是,我们非常感谢任何扩展CPXYPlotSpace功能的贡献,以增加对单向移动的支持.


小智 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;
}
Run Code Online (Sandbox Code Playgroud)