Основной график отключает масштабирование по оси Y, прокрутку

Я хочу сделать что-то вроде этого: 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;

кто-нибудь, пожалуйста, объясните мне, каков правильный результат и как он работает на самом деле.

Спасибо за ответы


person flatronka    schedule 29.02.2012    source источник


Ответы (2)


Самый простой способ — просто игнорировать 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;
}
person Eric Skroch    schedule 01.03.2012
comment
Идеальный ответ, он работает, большое спасибо, только 1 вещь: когда я сильно уменьшаю масштаб, приложение вылетает с этим сообщением: -[CPTPlotRange mutableCopyWithZone:]: нераспознанный селектор отправлен экземпляру 0xd876030 01-03-2012 07:41 :58.676 SSDev[823:11f03] *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[CPTPlotRange mutableCopyWithZone:]: нераспознанный селектор отправлен в экземпляр 0xd876030» *** Стек вызовов первого броска: - person flatronka; 01.03.2012

У меня была похожая ситуация и проблема, и это сводило меня с ума, потому что я забыл установить делегат:

plotSpace.delegate = self;
person veich    schedule 25.05.2015