Ich versuche, EChart, eine Bibliothek für Balkendiagramme auf Github für meine eigenen Zwecke anzupassen. In dieser Datei: https://github.com/zhuhuihuihui/EChart/blob/master/EChart/EColumn.mUIBezierPath Zeichnen über den vorherigen Pfad?
Ich versuche, die setGrade:
Methode zu ändern, so dass anstatt den gesamten Balken von der Unterseite des Diagramms nach oben zu zeichnen, stattdessen wird es nur auf den oberen Rand der Leiste auf die nächste gewünschte Y-Position zeichnen in der Grafik. Ich habe unten ein GIF eingefügt, um das Problem zu zeigen, das ich habe.
dies der Code ist, dass diese Stange Zeichnung (zusammen mit einem CABasicAnimation darunter):
-(void)setGrade:(float)grade {
_grade = grade;
UIBezierPath *progressline = [UIBezierPath bezierPath];
[progressline moveToPoint:CGPointMake(self.frame.size.width/2.0, self.frame.size.height)];
[progressline addLineToPoint:CGPointMake(self.frame.size.width/2.0, (1 - grade) * self.frame.size.height)];
_chartLine.path = progressline.CGPath;
_chartLine.strokeEnd = 1.0;
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = 1.0;
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];
[_chartLine addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}
Dieser Code aus EColumnChart.m genannt wird (https://github.com/zhuhuihuihui/EChart/blob/master/EChart/EColumnChart.m) Dies ist der relevante Teil, wenn die erste gerade initialisiert eine Bar zum ersten Mal, und die zweite I angepasst, um nur den Wert zu aktualisieren, die setGrade:
Methode aufrufen
if (nil == eColumn) {
eColumn = [[EColumn alloc] initWithFrame:CGRectMake(widthOfTheColumnShouldBe * 0.5 + (i * widthOfTheColumnShouldBe * 1.5), 0, widthOfTheColumnShouldBe, self.frame.size.height)];
eColumn.shouldAnimate = NO;
eColumn.backgroundColor = [UIColor clearColor];
eColumn.grade = eColumnDataModel.value/_fullValueOfTheGraph;
eColumn.eColumnDataModel = eColumnDataModel;
[eColumn setDelegate:self];
[self addSubview:eColumn];
} else {
eColumn.shouldAnimate = YES;
eColumn.grade = eColumnDataModel.value/_fullValueOfTheGraph;
}
[_eColumns setObject:eColumn forKey:[NSNumber numberWithInteger:currentIndex ]];
_fullValueOfTheGraph hat seinen eigenen Algorithmus, um zu bestimmen, wie weit die grap h die Bar sollte gezogen werden. Der eColumnDataModel.value ist nur eine Ganzzahl, die ich ihm gebe, das ist der Y-Wert der Balkenspalte.
Ich bin extrem mit Bezier-Pfade nicht vertraut. Ist der Trick, um den Bezier Pfad zu einem ivar und irgendwie den Top-Standort zu verfolgen?
aktualisieren: Ich habe versucht, diesen Code in dem Anfangsteil des setGrade zu verwenden: Methode aber es schafft nur die kleine Splitter Differenz zwischen dem letzten Update und der aktuellen. Ich habe einen prevGrade-Ivar hinzugefügt, der die letzte Klasse ist, die zum Aktualisieren der Leiste verwendet wurde. Es ist nah, aber es ist so, als müsste ich die Bezier-Pfade kombinieren, um die volle Balkenform zu bekommen. Irgendwelche Ideen?
UIBezierPath *_progressline = [UIBezierPath bezierPath];
if (_prevGrade != 0.0f) {
if (grade < _prevGrade) { //Bar graph going down
[_progressline moveToPoint:CGPointMake(self.frame.size.width/2.0, (1 + _prevGrade) * self.frame.size.height)];
} else { //Bar graph going up
[_progressline moveToPoint:CGPointMake(self.frame.size.width/2.0, (1 - _prevGrade) * self.frame.size.height)];
}
} else {
[_progressline moveToPoint:CGPointMake(self.frame.size.width/2.0, self.frame.size.height)];
}
[_progressline addLineToPoint:CGPointMake(self.frame.size.width/2.0, (1 - grade) * self.frame.size.height)];
Sie Code geschrieben, der einen Bezier-Pfad schafft, aber nicht der Kontext, in dem dieser Code verwendet wird, noch der Code, der tatsächlich zieht oder beseelt, dass Bezierkurve. Außerdem erzeugt der Code, den Sie gepostet haben, eine 1-Punkt-dicke Linie und das GIF, das Sie zeigen, ist deutlich dicker als das.Sie müssen eine klare, vollständige Beschreibung Ihres Vorgehens und Ihrer Vorgehensweise bereitstellen, wenn Sie Hilfe benötigen. –
@DuncanC Alle Informationen hinzugefügt, die es unklar gemacht haben. Dieser Code enthält alle erforderlichen Code zum Zeichnen der Balkenspalte. Es gibt nichts anderes in der Bibliothek, das es zeichnet. –