Domanda

Sto usando core-plot lib per disegnare grafici a barre nella mia app come questo  ......

Il mio problema è che voglio l'abilitazione del movimento grapgh solo in direzione orizzontale in modo che posso vedere i record per un lungo periodo di tempo, ma il problema è che ho appena Wnt per mantenere l'asse y fissato al suo posto,

Come posso fare questo?

In attesa di aiuto ....

È stato utile?

Soluzione

Solo di recente ha interazione con l'utente rudimentale stata attivata nei grafici Plot core. Per consentire lo scorrimento in qualsiasi direzione, è possibile impostare la proprietà allowsUserInteraction dello spazio complotto per YES.

Attualmente non abbiamo mezzi di bloccaggio che il movimento in una direzione. L'azione di scorrimento avviene nel metodo -pointingDeviceDraggedAtPoint: su CPXYPlotSpace, così si potrebbe sottoclasse CPXYPlotSpace, copiare la sua attuazione di tale metodo, e modificarlo per consentire solo uno spostamento nella direzione X. Ancora meglio, saremmo lieti di ricevere contributi per estendere le funzionalità del CPXYPlotSpace per aggiungere il supporto per il movimento unidirezionale.

Altri suggerimenti

Se si utilizza core-Plot 0.2.2 o superiore (forse anche prima), allora si può aggiungere un metodo sul delegato del vostro spazio complotto per gestire la seguente:

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

In questo modo limitare i movimenti trama a orizzontale solo. Questo presuppone che si è permesso di interagire con lo spazio plot impostando allowsUserInteraction = YES.

Limite scorrimento impostando un delegato (cioè, CPPlotSpaceDelegate) sullo spazio trama e implementare il metodo willChangePlotRangeTo. È possibile fare altre cose interessanti allo stesso tempo. Ecco come ho limitare la visualizzazione nel quadrante uno:

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

ho usato un modo semplice per "disattivare" lo scorrimento verticale

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

Per, miny e maxy ho messo i valori ho visualizzato, come che i limiti verticali sono quello che si vede, quindi non è possibile scorrimento verticale

Ha funzionato per me, dopo aver visto l'argomento, così ho voluto completare le vostre risposte con le mie

.

Utilizzando CorePlot 1.0 - Per limitare lo scorrimento a solo orizzontale e scalare così, ho implementato due metodi CPTPlotSpaceDelegate: metodo con Steve Tranby con un metodo modificato suggerito da 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;
}

io sto usando 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 sarà necessario aggiungere CPPlotSpaceDelegate, protocolli CPLineStyleDelegate al controller

e aggiungere (per CPLineStyleDelegate)

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

sistema manterrà la gamma originale dell'asse y

Tutto quello che dovete fare per risolvere l'asse y dopo la risposta 4 con il commento incl. (newRange.doublePrecisionLocation è ora newRange.locationDouble) è quella di impostare plotSpace.globalYRange = plotSpace.yRange;

grazie a supperAly quando la mia interfaccia implementa il protocollo "CPPlotSpaceDelegate" e il progetto non può essere rispettato normalmente, e dimostra che:  your interface xxx doesn't implement 'CPLineStyleDelegate' protocol, che mi fanno confondere. così ho aggiungere il metodo: -(void)lineStyleDidChange:(CPLineStyle *)lineStyle { //empty } per CPLineStyleDelegate e aggiungere <CPLineStyleDelegate> alla mia interfaccia ei problemi sono andati.

Il seguente codice si basa su di Tom Donaldson risposta ed è stato testato con 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;
}

È possibile ignorare il

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

funzione CPTXYPlotSpace ed estrarre tutto il codice relativo al movimento per l'asse y.

@Andrew S: "Mi sto 'incarico di proprietà di sola lettura' sul newRange.location = CPTDecimalFromFloat (0.0); "

che ho avuto, anche, e, seguendo l'esempio "CurvedScatterPlot" nella galleria core-Plot app, utilizzato una copia mutabile di newRange in plotSpace: willChangePlotRangeTo: forCoordinate: ...

* CPTMutablePlotRange ChangedRange = [newRange mutableCopy];

changedRange.location = CPTDecimalFromCGFloat (0.0f); passa poi Muster e ho usato ChangedRange nel if ... else blocco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top