문제

내 앱에 이와 같은 막대 차트를 그리기 위해 core-plot lib를 사용하고 있습니다. ......

내 문제는 오랫동안 기록을 볼 수 있도록 수평 방향으로만 그래프 이동을 활성화하고 싶다는 것입니다. 하지만 문제는 y축을 제자리에 고정하고 싶지 않다는 것입니다.

어떻게 해야 하나요?

도움을 기다리고 있습니다....

도움이 되었습니까?

해결책

최근에야 핵심 플롯 그래프에서 초보적인 사용자 상호 작용이 활성화되었습니다. 어떤 방향 으로든 스크롤을 활성화하려면 allowsUserInteraction 음모 공간의 속성 예.

우리는 현재 그 움직임을 한 방향으로 고정시킬 수단이 없습니다. 스크롤 작업은에서 발생합니다 -pointingDeviceDraggedAtPoint: CPXYPLOTSPACE의 메소드 CPXYPLOTSPACE 서브 클래스, 해당 방법의 구현을 복사 한 다음 X 방향으로 만 움직일 수 있도록 변경할 수 있습니다. 더 좋은 점은 CPXYPlotspace의 기능을 확장하여 단방향 이동에 대한 지원을 추가하는 데 기여한 것이 좋습니다.

다른 팁

Core-Plot 0.2.2 이상(아마도 이전 버전)을 사용하는 경우 플롯 공간의 대리자에 메서드를 추가하여 다음을 처리할 수 있습니다.

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

이렇게 하면 플롯 이동이 수평으로만 제한됩니다.이는 allowedUserInteraction = YES를 설정하여 플롯 공간과의 상호 작용을 허용했다고 가정합니다.

플롯 공간에서 대의원 (즉, cpplotspacedElegate)을 설정하고 WillChangePlotrangeto 메소드를 구현하여 스크롤을 제한하십시오. 당신은 동시에 다른 멋진 일을 할 수 있습니다. 디스플레이를 사분면 1으로 제한하는 방법은 다음과 같습니다.

- (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

수직 스크롤을 "비활성화"하기 위해 간단한 방법을 사용했습니다.

    CPPlotRange *globalYRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromDouble(minY) length:CPDecimalFromDouble(maxY)];
    plotSpace.globalYRange = globalYRange;

Miny와 Maxy는 내가 표시 한 값을 넣었습니다. 수직 제한이 당신이 보는 것과 같이 수직 스크롤을 할 수 없습니다.

그것은 당신의 주제를 본 후에 저를 위해 일했기 때문에 당신의 답변을 완성하고 싶었습니다.

CorePlot 1.0을 사용하여 스크롤을 수평 및 스케일링으로 제한하기 위해 Supperaly/EDO42에서 제안한 수정 된 방법을 사용하여 두 개의 CPTPlotspacedElegate 메소드를 구현했습니다.

-(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;
}

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;
}

u는 컨트롤러에 cpplotspacedelegate, cplinestyledelegate 프로토콜을 추가해야합니다.

추가 (cplinestyledelegate의 경우)

-(void)lineStyleDidChange:(CPLineStyle *)lineStyle
{
//empty
}

시스템은 Y 축의 원래 범위를 유지합니다.

주석이 포함된 답변 4 이후에 y축을 수정하기 위해 해야 할 일은 모두 다음과 같습니다.( newRange.doublePrecisionLocation 지금은 newRange.locationDouble )을 설정하는 것입니다 plotSpace.globalYRange = plotSpace.yRange;

내 인터페이스가 "cpplotspacedelegate"프로토콜을 구현할 때 Supperaly 덕분에 프로젝트는 정상적으로 준수 할 수 없으며 다음을 보여줍니다. your interface xxx doesn't implement 'CPLineStyleDelegate' protocol, 나를 혼란스럽게합니다. 그래서 메소드를 추가합니다. -(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty } cplinestyledelegate 및 추가 <CPLineStyleDelegate> 내 인터페이스와 문제가 사라졌습니다.

다음 코드는 다음과 같습니다 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;
}

당신은 그것을 무시할 수 있습니다

-(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint`

cptxyPlotspace에서 기능하고 Y 축의 움직임과 관련된 모든 코드를 제거하십시오.

@Andrew S : "나는 newrange.location = cptdecimalfromfloat (0.0)에서"읽기 전용 속성에 대한 과제를 받고있다 ";"

나는 또한 코어 플롯 갤러리 앱의 "CurvedscatterPlot"예제에 따라 Plotspace : WillchangePlotrangeto : forcoordinate : ...

cptMutablePlotRange *ChangeRange = [NewRange MutableCopy];

ChangeRange.Location = CPTDECIMALFROMCGFLOAT (0.0F); 그런 다음 Muster를 통과하고 IF ... Else Block에서 ChangeRange를 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top