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?
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:
Verzögerung von Annotation Rahmen, wenn Bereich verändert sich - siehe den Film: https://www.youtube.com/watch?v=R66ew6GAiJU&feature=youtu.be
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;
}
Überprüfen Sie den Link http://stackoverflow.com/questions/19886928/willchangeplotrangeto-makes-no-difference-to-graphs-in-core-plot –