2016-06-27 7 views
0

Ich verwende Datumsbezeichnungen auf der X-Achse und möchte ein bestimmtes Datum mit der benutzerdefinierten Ansicht hervorheben. Ich plane axis:labelWasSelected:, bewegen Sie die annotationFrame Etiketten Position zu verwenden und blättern sie (Anmerkung in plotSpacewillChangePlotRangeToForCoordinate: bewegen), wenn Achsenbereich (simillar bis core plot Framework - How to set custom UIView in CPTPlotSpaceAnnotation)Coreplot - Koordinaten und Größe der Achsenbeschriftung

geändert wird Wie kann ich Koordinaten des Etiketts erhalten, wenn sie von plotSpacewillChangePlotRangeToForCoordinate genannt?

enter image description here

EDIT: ich erfolgreich implementiert haben Annotation durch Benutzerauswahl aufgerufen bewegt: Ich habe die _selectedLabel speichern und newFrame senden, wenn Bereich des Plots Änderungen. Das sind 2 Probleme mit, dass:

  1. Verzögerung von Annotation Rahmen, wenn Bereich verändert sich - siehe den Film: https://www.youtube.com/watch?v=R66ew6GAiJU&feature=youtu.be

  2. wenn kommentierte Etikett den Bildschirm verlässt, die _selectedLabel „vergessen“ wird. Bei der Rückkehr zum Bildschirm wird wahrscheinlich das neue Etikett erstellt und meine _selectedLabel Verweise auf den alten Objekt-> Rahmen bleibt bei x = 0 (der Punkt, den es den Bildschirm verließ). Vielleicht ist es irgendwie möglich, Koordinaten eines bestimmten Labels zu erhalten (basierend auf dem Vergleich mit dateToAnnotate)?

    -(void)axis:(CPTAxis *)axis labelWasSelected:(CPTAxisLabel *)label { 
         NSLog(@"labelWasSelected: %@",label); 
         _selectedLabel = label; 
         CGRect graphLabelFrame = [self adjustAnnotationFrameForLabel:_selectedLabel]; 
         [_delegate datesPlot:self didAnnotateFrame:graphLabelFrame animating:YES]; 
        } 
    
    -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { 
        CGRect graphLabelFrame = [self adjustAnnotationFrameForLabel:_selectedLabel]; 
        [_delegate datesPlot:self didAnnotateFrame:graphLabelFrame animating:NO]; 
    } 
    

und Delegieren:

-(void)datesPlot:(datesPlot*) plot didAnnotateFrame:(CGRect)frame animating:(BOOL)animating{ 
    if (animating) { 
    [UIView animateWithDuration:0.3 animations:^{ 
     _annotationView.frame = [self.view convertRect:frame fromView:_datesHostingView]; 
    }]; 
    } 
    else { 
     _annotationView.frame = [self.view convertRect:frame fromView:_datesHostingView]; 
    } 

    [_annotationView setNeedsLayout]; 
} 

EDIT2: adjustAnnotation - fügt Abstand und übersetzt Rahmen Graph setNeedLayout Koordinaten durch die Delegierten aufgerufen wird, nachdem sie in übergeordneter Ansicht Koordinaten übersetzt wird.

-(CGRect)adjustAnnotationFrameForSelectedLabel { 
    NSLog(@"selected Label:\n %@", _selectedLabel); 
    float annotationMargin = 20; 
    CGRect labelFrame = _selectedLabel.contentLayer.frame; 
    NSLog(@"labelframe: x: %f, y: %f", labelFrame.origin.x, labelFrame.origin.y); 
    //add margin for annotation to label's frame 
    CGRect annotationFrame = CGRectMake(labelFrame.origin.x-annotationMargin/2, labelFrame.origin.y-annotationMargin/2, 
             labelFrame.size.width+annotationMargin, labelFrame.size.height+annotationMargin); 
    // convert from plot area coordinates to graph (and hosting view) coordinates 
    CGRect graphLabelFrame = [self.graph convertRect:annotationFrame fromLayer:self.graph.plotAreaFrame.plotArea]; 
    NSLog(@"graphLabelFrame: x: %f, y: %f", graphLabelFrame.origin.x, graphLabelFrame.origin.y); 
    return graphLabelFrame; 

} 
+0

Überprüfen Sie den Link http://stackoverflow.com/questions/19886928/willchangeplotrangeto-makes-no-difference-to-graphs-in-core-plot –

Antwort

1

Der zweite Parameter der Methode -axis:labelWasSelected: ist die Achsenbezeichnung. Die contentLayer des Labels ist eine CALayer Unterklasse, die tatsächlich das Etikett anzeigt. Verwenden Sie die integrierten Koordinatenkonvertierungsmethoden, um die frame und/oder bounds der contentLayer in den Koordinatenraum der Annotation annotationHostLayer zu konvertieren.

+0

Ihre Lösung hat funktioniert, aber ich habe immer noch ein paar Probleme. Bitte, siehe Bearbeiten. – izik461

+0

1. Gibt '-adjustAnnotationFrameForLabel:' '' '' '' '' '' '' auf der Etikettenebene an, um sicherzustellen, dass der 'frame' vor dem Lesen aktuell ist? –

+0

2. Die Core Plot-Beschriftungsrichtlinien entfernen Beschriftungen, wenn sie nicht mehr sichtbar sind, um Speicher zu sparen. Sie können die Richtlinien "Keine" oder "Bereitgestellt" verwenden, um mehr Kontrolle darüber zu haben, wo sich die Labels befinden. Andernfalls sehen Sie sich den neuen Plotbereich in der delegierten Methode "willChange" an. Wenn der Anmerkungsort außerhalb dieses Bereichs liegt, blenden Sie ihn aus. Wenn es in den Plot-Bereich zurückkehrt, sehen Sie sich die 'tickLocation' jedes Labels an, um das mit dem Annotation-Ort übereinstimmende zu finden. –