我有以下CorePlot(v1.2)代码,该代码基于http://www.raywenderlich.com/13271/how-to-draw-graphs-with-core-plot-part-2的教程,但扩展了一些。使用大约30个数据点,在iPhone 4S上渲染图形大约需要3秒钟。图表确实正确加载,它只是很慢。无论如何都要提高性能?
以下是代码的NSLog输出:
2013-05-30 17:41:20.386 myApp[2796:907] A
2013-05-30 17:41:20.387 myApp[2796:907] B
2013-05-30 17:41:20.388 myApp[2796:907] C
2013-05-30 17:41:20.389 myApp[2796:907] D
2013-05-30 17:41:21.158 myApp[2796:907] E
2013-05-30 17:41:21.160 myApp[2796:907] F
2013-05-30 17:41:22.594 myApp[2796:907] G
NB代码完成运行后,在渲染图形之前还有大约0.5秒的延迟。
代码:
-(void)configureAxes {
NSLog(@"A");
// 1 - Create styles
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = @"Helvetica-Bold";
axisTitleStyle.fontSize = 12.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = @"Helvetica-Bold";
axisTextStyle.fontSize = 11.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.0f;
NSLog(@"B");
// 2 - Get axis set
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;
// 3 - Configure x-axis
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
lineStyle.lineColor = [CPTColor whiteColor];
lineStyle.lineWidth = 2.0f;
CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle];
textStyle.fontName = @"Helvetica";
textStyle.fontSize = 14;
textStyle.color = [CPTColor whiteColor];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0.0");
axisSet.xAxis.minorTicksPerInterval = 0;
NSLog(@"C");
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
if ([person.unitPreference isEqualToString:@"US"]) {
[dateFormatter setDateFormat:@"MMM-dd"];
} else {
[dateFormatter setDateFormat:@"dd-MMM"];
}
NSLog(@"D");
CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
axisSet.xAxis.labelFormatter = timeFormatter;
axisSet.xAxis.labelRotation = M_PI/4;
axisSet.xAxis.titleOffset = 55.5f;
axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
NSLog(@"E");
if ([measurementField isEqualToString:@"mWeight"]) {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"Kgs";
} else if ([person.unitPreference isEqualToString:@"US"]) {
unit = @"lbs";
} else {
unit = @"st lbs";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Weight (%@)", unit];
WeightFormatter *weightFormatter = [[WeightFormatter alloc] init];
weightFormatter.person = person;
axisSet.yAxis.labelFormatter = weightFormatter;
} else if ([measurementField isEqualToString:@"mBodyFatPercentage"]) {
axisSet.yAxis.title = @"Body Fat %";
axisSet.yAxis.labelFormatter = [[BodyFatPercentageFormatter alloc] init];
} else {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"CMs";
} else {
unit = @"Inches";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Measurements (%@)", unit];
MeasurementFormatter *measurementFormatter = [[MeasurementFormatter alloc] init];
measurementFormatter.person = person;
axisSet.yAxis.labelFormatter = measurementFormatter;
}
NSLog(@"F");
axisSet.yAxis.titleTextStyle = textStyle;
axisSet.yAxis.titleOffset = 40.0f + marginOffset;
axisSet.yAxis.axisLineStyle = lineStyle;
axisSet.yAxis.majorTickLineStyle = lineStyle;
axisSet.yAxis.minorTickLineStyle = lineStyle;
axisSet.yAxis.labelTextStyle = textStyle;
axisSet.yAxis.labelOffset = 3.0f;
axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat((yAxisMax-yAxisMin)/10.0f);
axisSet.yAxis.minorTicksPerInterval = 1;
axisSet.yAxis.minorTickLength = 5.0f;
axisSet.yAxis.majorTickLength = 7.0f;
axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(yAxisMin);
axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay);
NSLog(@"G");
}
答案 0 :(得分:0)
这是coreplot 1.2引入的内容。以下几行会导致应用程序挂起很长时间:
axisSet.xAxis.labelRotation = M_PI/4;
axisSet.xAxis.titleOffset = 55.5f;
恢复到1.1立即解决了问题。从@Eric Skroch上面的评论来看,这可能会在1.3中得到修复,但我希望在此之前使用稳定的版本,尤其是因为我没有使用1.2中的任何新功能。
顺便说一下,我认为旧图书馆没有使用我的iPhone 5的原因是没有以下内容:
在目标构建设置中添加到其他链接器标志:
-ObjC -all_load
答案 1 :(得分:0)
将标签政策设置为无非常重要,以明确您将自定义x和y轴。
CPTAxis *x = axisSet.xAxis;
CPTAxis *y = axisSet.yAxis;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelingPolicy = CPTAxisLabelingPolicyNone;