核心绘图禁用y轴缩放和滚动

4

我希望制作类似于这个的东西:http://youtu.be/PeRhxSCx2xM

我尝试实现以下方法:

//viewDidLoad
//plotSpace.delegate = self;

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space
     willChangePlotRangeTo:(CPTPlotRange *)newRange
             forCoordinate:(CPTCoordinate)coordinate {

    NSLog(@"WillChangePlotRangeTo");

    // only allows scrolling to the right
    // remove this to have scrolling in both directions
    if (newRange.locationDouble < 0.0F) {
        newRange.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 *)graph.axisSet;
    if (coordinate == CPTCoordinateX) {
        axisSet.yAxis.orthogonalCoordinateDecimal = newRange.location;
        axisSet.xAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble +
                                                         (newRange.lengthDouble / 2.0F));
    } else {
        axisSet.xAxis.orthogonalCoordinateDecimal = newRange.location;
        axisSet.yAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble +
                                                         (newRange.lengthDouble / 2.0F));
    }

    return newRange;
}

我也尝试了这个方法,当我缩小页面时它有效,但是当我放大页面时无效。

plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(3.0)];
plotSpace.globalYRange = plotSpace.yRange;

请有人帮我解释一下,什么是正确的结果,它实际上是如何工作的。

感谢回复。

2个回答

13

最简单的方法就是忽略newRange并返回现有的yRange作为y坐标。您无需在此处更新轴属性。有更简单的方法可以完成这项任务。

图表设置:

// leave the titleLocation for both axes at the default (NAN) to center the titles
xAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];

绘图空间代理:

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space
      willChangePlotRangeTo:(CPTPlotRange *)newRange
              forCoordinate:(CPTCoordinate)coordinate {

    CPTPlotRange *updatedRange = nil;

    switch ( coordinate ) {
    case CPTCoordinateX:
        if (newRange.locationDouble < 0.0F) {
            CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease];
            mutableRange.location = CPTDecimalFromFloat(0.0);
            updatedRange = mutableRange;
        }
        else {
            updatedRange = newRange;
        }
        break;
    case CPTCoordinateY:
        updatedRange = ((CPTXYPlotSpace *)space).yRange;
        break;
    }
    return updatedRange;
}

完美的答案,它正在工作,非常感谢你,只有一件事:当我进行大缩放时,应用程序会崩溃,并显示以下消息:-[CPTPlotRange mutableCopyWithZone:]:向实例0xd876030发送未识别的选择器 2012-03-01 07:41:58.676 SSDev[823:11f03] ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“-[CPTPlotRange mutableCopyWithZone:]:向实例0xd876030发送未识别的选择器” ***第一个抛出调用堆栈: - flatronka

1

我遇到了类似的情况和问题,让我很疯狂,因为我忘记设置委托:

plotSpace.delegate = self;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接