2009-12-12 18 views
8

I-Kern-Plot lib bin mit Balkendiagramme in meiner App wie dieses ......Horizontales Scrollen nur im Core-Plot-Balkendiagramm zulassen?

Mein Problem zu ziehen ist, dass ich die Freigabe von grapgh Bewegung nur in horizontaler Richtung will, so dass ich die Aufzeichnungen über einen langen Zeitraum sehen von Zeit, aber das Problem ist, dass ich nur wollte, dass die y-Achse an ihrem Platz fixiert,

Wie kann ich das tun?

Warten auf Hilfe ....

+1

Ich weiß nicht, warum Sie mein bearbeiten letztes Mal zurückgesetzt. Imgur ist viel schneller als FreeImageHosting.net, die Zeit abläuft, wenn ich versuche, das Bild als Teil dieser Seite zu laden. –

Antwort

10

Erst vor kurzem hat rudimentäre Interaktion mit dem Benutzer in Core-Plot Graphen aktiviert. Um das Scrollen in eine beliebige Richtung zu ermöglichen, können Sie die Eigenschaft allowsUserInteraction des Plotbereichs auf YES setzen.

Wir haben derzeit keine Möglichkeit, diese Bewegung in eine Richtung zu sperren. Die Bildlaufaktion findet in der Methode -pointingDeviceDraggedAtPoint: auf CPXYPlotSpace statt, sodass Sie CPXYPlotSpace unterklassen können, die Implementierung dieser Methode kopieren und so ändern, dass sie nur die Bewegung in X-Richtung zulässt. Noch besser, wir würden uns über jeden Beitrag freuen, der die Funktionalität des CPXYPlotSpace erweitert, um Unterstützung für unidirektionale Bewegungen hinzuzufügen.

+0

Hallo Brad, ich implementierte die Lösung wie Sie bei http://stackoverflow.com/questions/1899553/keeping-the-y-axis-fixed-at-place implementiert, aber ich bin immer noch nicht in der Lage, den Ursprung –

+1

zu beheben @BradLarson ist da eingebauter Support dafür noch hinzugekommen oder nicht? –

14

Begrenzen Sie das Scrollen, indem Sie einen Delegaten (d. H. CPPlotSpaceDelegate) im Zeichenbereich festlegen und die Methode "willChangePlotRangeTo" implementieren. Sie können andere coole Dinge gleichzeitig tun. Hier ist, wie ich die Anzeige begrenzen eine Quadranten:

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

See: CPPlotSpace.h

+3

newRange.doublePrecisionLocation ist jetzt newRange.locationDouble – titaniumdecoy

+1

newRange.doublePrecisionLength ist jetzt newRange.lengthDouble – ben

+2

Ich bekomme die Zuweisung, nur Eigenschaft auf zu lesen: newRange.location = CPTDecimalFromFloat (0.0); –

2

Alles, was Sie tun müssen, um die y-Achse nach Antwort 4 mit dem Kommentar inkl zu beheben. (newRange.doublePrecisionLocation ist jetzt newRange.locationDouble) ist plotSpace.globalYRange = plotSpace.yRange;

21

einstellen Wenn Sie mit Kern-Plot 0.2.2 oder höher (möglicherweise früher), dann können Sie eine Methode auf dem Grundstück Platz des Delegierten fügen Sie folgendes zu behandeln:

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

Dadurch wird die Bewegung des Diagramms auf nur horizontal beschränkt. Dies setzt voraus, dass Sie die Interaktion mit dem Zeichenbereich zugelassen haben, indem Sie lensUserInteraction = YES setzen.

+0

ich nur in der Lage war, dies zu erhalten, nachdem tat einem hg Klon des Repository zu arbeiten. Mit den Installateuren hatte ich kein Glück. – ben

+1

funktioniert auf CorePlot v1.1 – DiscDev

+0

funktioniert immer noch auf 1,4 – Chris

12

ich eine einfache Art und Weise verwendet, um „disable“ die vertikale Bildlauf

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

Denn minY und maxY ich die Werte habe ich angezeigt, wie dass die vertikalen Grenzen sind, was Sie sehen, so dass Sie nicht vertikaler Scroll

Es funktionierte für mich, nachdem ich Ihr Thema sah, so wollte ich mit meiner Ihren Antworten vervollständigen

+0

Kann das Scrollen auf die negative X-Achse begrenzt werden? –

2

i CorePlot 0,2 verwenden.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 müssen CPPlotSpaceDelegate, CPLineStyleDelegate Protokolle zu dem Controller

und fügen (für CPLineStyleDelegate)

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

das System hält den ursprünglichen Bereich der Y-Achse

1
hinzuzufügen

dank supperAly wenn meine Schnittstelle „CPPlotSpaceDelegate“ Protokoll und das Projekt c implementiert ein nicht normal befolgt werden, und zeigt, dass: your interface xxx doesn't implement 'CPLineStyleDelegate' protocol, die mich verwirren machen. so füge ich die Methode: -(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty } für CPLineStyleDelegate und fügen <CPLineStyleDelegate> meiner Schnittstelle und die Probleme sind verschwunden.

0

können Sie die

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

Funktion in CPTXYPlotSpace außer Kraft setzen und den gesamten Code der Bewegung für y-Achse im Zusammenhang herausnehmen.

10

Verwendung von CorePlot 1.0 - Um das Scrollen auf nur horizontale und Skalierung einzuschränken, habe ich die zwei CPTPlotSpaceDelegate-Methoden implementiert: Methode von Steve Tranby mit einer modifizierten Methode, die von superpper/edo42 vorgeschlagen wird.

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

Würde es Ihnen etwas ausmachen, auch den Code zum Einrichten des Graphen zu teilen? Ich meine den Startpunkt der Einrichtung des CPTPlotSpace am Anfang. Ich habe deine Lösung verfolgt, aber meine eine funktioniert immer noch nicht. Bitte helfen Sie! >. < – nullmicgo

+0

Sie sind der Mann ... Danke für die wunderbare Antwort Jay ... :) abgestimmt –

0

@ Andrew S: "Ich bin 'Zuordnung zu schreibgeschützte Eigenschaft' immer auf newRange.location = CPTDecimalFromFloat (0,0);"

Ich hatte das auch, und nach dem "CurvedScatterPlot" Beispiel in der Core-Plot Galerie App, eine veränderbare Kopie newRange in plotSpace verwendet: willChangePlotRangeTo: forCoordinate: ...

CPTMutablePlotRange * changedRange = [newRange veränderbare Kopie];

changedRange.location = CPTDecimalFromCGFloat (0.0f); dann passiert muster und ich benutze changedRange im if ... else block.

1

Der folgende Code basiert auf Tom Donaldson's answer und wird mit CorePlot 1.5.1 getestet:

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