2012-02-13 17 views
0

私はアプリをコンパイルしていますが、グラフは表示されません。Xcode 4.2のiOS coreplot

RaceDetailView.h

#import <UIKit/UIKit.h> 
#import "CorePlot-CocoaTouch.h" 

@interface RaceDetailView : UIView <CPTPlotDataSource, CPTPlotSpaceDelegate> 

@property (nonatomic, retain) NSArray *plotData; 
@property (nonatomic, retain) NSString *title; 
@property (nonatomic, retain) CPTGraphHostingView *layerHostingView; 
@property CGFloat labelRotation; 

- (void)setTitleDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds; 
- (void)setPaddingDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds; 
-(NSUInteger)numberOfRecords; 
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index; 

@end 

RaceDetailView.m

#import "RaceDetailView.h" 

@implementation RaceDetailView 

@synthesize layerHostingView; 
@synthesize labelRotation; 
@synthesize title; 
@synthesize plotData; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     title = @"my race chart"; 

     plotData = [[NSMutableArray alloc] initWithObjects: 
        [NSNumber numberWithDouble:20.0], 
        [NSNumber numberWithDouble:30.0], 
        [NSNumber numberWithDouble:60.0], 
        nil]; 

     CPTGraph *graph = [[[CPTXYGraph alloc] initWithFrame:frame] autorelease]; 
     //[self addGraph:graph toHostingView:layerHostingView]; 
     layerHostingView.hostedGraph = graph; 
     //[self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; 
     [graph applyTheme:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; 

     [self setTitleDefaultsForGraph:graph withBounds:frame]; 
     [self setPaddingDefaultsForGraph:graph withBounds:frame]; 

     // Setup scatter plot space 
     CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
     plotSpace.allowsUserInteraction = YES; 
     plotSpace.delegate = self; 

     // Grid line styles 
     CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; 
     majorGridLineStyle.lineWidth = 0.75; 
     majorGridLineStyle.lineColor = [[CPTColor colorWithGenericGray:0.2] colorWithAlphaComponent:0.75]; 

     CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle]; 
     minorGridLineStyle.lineWidth = 0.25; 
     minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1];  

     CPTMutableLineStyle *redLineStyle = [CPTMutableLineStyle lineStyle]; 
     redLineStyle.lineWidth = 10.0; 
     redLineStyle.lineColor = [[CPTColor redColor] colorWithAlphaComponent:0.5]; 

     // Axes 
     // Label x axis with a fixed interval policy 
     CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
     CPTXYAxis *x = axisSet.xAxis; 
     x.majorIntervalLength = CPTDecimalFromString(@"0.5"); 
     x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1.0"); 
     x.minorTicksPerInterval = 2; 
     x.majorGridLineStyle = majorGridLineStyle; 
     x.minorGridLineStyle = minorGridLineStyle; 

     x.title = @"X Axis"; 
     x.titleOffset = 30.0; 
     x.titleLocation = CPTDecimalFromString(@"1.25"); 

     // Label y with an automatic label policy. 
     CPTXYAxis *y = axisSet.yAxis; 
     y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; 
     y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"1.0"); 
     y.minorTicksPerInterval = 2; 
     y.preferredNumberOfMajorTicks = 8; 
     y.majorGridLineStyle = majorGridLineStyle; 
     y.minorGridLineStyle = minorGridLineStyle; 
     y.labelOffset = 10.0; 

     y.title = @"Y Axis"; 
     y.titleOffset = 30.0; 
     y.titleLocation = CPTDecimalFromString(@"1.0"); 

     // Rotate the labels by 45 degrees, just to show it can be done. 
     labelRotation = M_PI * 0.25; 

     // Set axes 
     //graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil]; 
     graph.axisSet.axes = [NSArray arrayWithObjects:x, y, nil]; 

     // Create a plot that uses the data source method 
     CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; 
     dataSourceLinePlot.identifier = @"Data Source Plot"; 

     CPTMutableLineStyle *lineStyle = [[dataSourceLinePlot.dataLineStyle mutableCopy] autorelease]; 
     lineStyle.lineWidth = 3.0; 
     lineStyle.lineColor = [CPTColor greenColor]; 
     dataSourceLinePlot.dataLineStyle = lineStyle; 

     dataSourceLinePlot.dataSource = self; 
     [graph addPlot:dataSourceLinePlot]; 

     // Auto scale the plot space to fit the plot data 
     // Extend the y range by 10% for neatness 
     [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:dataSourceLinePlot, nil]]; 
     CPTPlotRange *xRange = plotSpace.xRange; 
     CPTPlotRange *yRange = plotSpace.yRange; 
     [xRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; 
     [yRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; 
     plotSpace.yRange = yRange; 

     // Restrict y range to a global range 
     CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) 
                    length:CPTDecimalFromFloat(2.0f)]; 
     plotSpace.globalYRange = globalYRange; 

     // set the x and y shift to match the new ranges 
     CGFloat length = xRange.lengthDouble; 
     //xShift = length - 3.0; 
     length = yRange.lengthDouble; 
     //yShift = length - 2.0; 

     // Add plot symbols 
     CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; 
     symbolLineStyle.lineColor = [CPTColor blackColor]; 
     CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
     plotSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]]; 
     plotSymbol.lineStyle = symbolLineStyle; 
     plotSymbol.size = CGSizeMake(10.0, 10.0); 
     dataSourceLinePlot.plotSymbol = plotSymbol; 

     // Set plot delegate, to know when symbols have been touched 
     // We will display an annotation when a symbol is touched 
     dataSourceLinePlot.delegate = self; 
     dataSourceLinePlot.plotSymbolMarginForHitDetection = 5.0f; 

     // Add legend 
     graph.legend = [CPTLegend legendWithGraph:graph]; 
     graph.legend.textStyle = x.titleTextStyle; 
     graph.legend.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; 
     graph.legend.borderLineStyle = x.axisLineStyle; 
     graph.legend.cornerRadius = 5.0; 
     graph.legend.swatchSize = CGSizeMake(25.0, 25.0); 
     graph.legendAnchor = CPTRectAnchorBottom; 
     graph.legendDisplacement = CGPointMake(0.0, 12.0); 
    } 
    return self; 
} 

- (void)setTitleDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds 
{ 
    graph.title = title; 
    CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; 
    textStyle.color = [CPTColor grayColor]; 
    textStyle.fontName = @"Helvetica-Bold"; 
    textStyle.fontSize = round(bounds.size.height/20.0f); 
    graph.titleTextStyle = textStyle; 
    graph.titleDisplacement = CGPointMake(0.0f, round(bounds.size.height/18.0f)); // Ensure that title displacement falls on an integral pixel 
    graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;  
} 

- (void)setPaddingDefaultsForGraph:(CPTGraph *)graph withBounds:(CGRect)bounds 
{ 
    float boundsPadding = round(bounds.size.width/20.0f); // Ensure that padding falls on an integral pixel 
    graph.paddingLeft = boundsPadding; 

    if (graph.titleDisplacement.y > 0.0) { 
     graph.paddingTop = graph.titleDisplacement.y * 2; 
    } 
    else { 
     graph.paddingTop = boundsPadding; 
    } 

    graph.paddingRight = boundsPadding; 
    graph.paddingBottom = boundsPadding;  
} 

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{ 
    return [plotData count]; 
} 

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{ 
    NSNumber *num; 
    if (fieldEnum == CPTPieChartFieldSliceWidth) { 
     num = [plotData objectAtIndex:index]; 
    } 
    else { 
     return [NSNumber numberWithInt:index]; 
    } 

    return num; 
} 

@end 

編集:あなたは、これがCorePlotSimpleScatterPlotからであることに気づくかもしれません。

答えて

3

なぜこのコードはUIViewにありますか?このコードは通常、ビューコントローラ(UIViewController)にあります。例を引っ張ったPlot Galleryアプリケーションは、メインビュー領域内の複数の場所でプロットを使用し、リストやブラウザビューのサムネイル画像を作成するため、もう少し複雑です。

layerHostingViewを設定しましたか?それはビュー階層内にあり、可視ですか?

@danielbeardが示すようにデータソースを確認してください。散布図の正しいフィールド名はCPTScatterPlotFieldXCPTScatterPlotFieldYです。

+0

'layerHostingView.hostedGraph = graph;'が有効です。私が例で示したことから、これは 'layerHostingView'を使う方法です。また、私はこのすべてのために 'UIViewController'を使用していました。私は何の理由でもないと思うUIViewに切り替えます。それにもかかわらず、これはまだ機能するはずです。 +1してください。 – Jacksonkr

+0

あなたは私の他の質問に答えたと思いますが、これは 'layerHostingView'と何か関係があると思います。私の終わりの*怠惰な間違い。ありがとう。 – Jacksonkr

1

スキャッタプロットを設定していて、CPTPieChartFieldSliceWidthを求めるnumberForPlotメソッドでこれが意図されていますか?あなたはグリッド線をまったく見ることができますか?またはグラフ全体が空白になっていますか?

+0

良い点。そして私はまったく線を見ません。それはすべて白い白です。私はおそらく最小限のグラフレイアウトを参照する必要があります。もちろん、それはすべてが正しく設定されているIFです。 +1してください。 – Jacksonkr

+0

ああ、私は今、 'CPTPieChartFieldSliceWidth'が* example *のコードであることを理解しています。幸いにも、それは私のシナリオでは決して実行してはならない場所にロジックによって制限されていますが、例では私はそれを邪魔しました。それにもかかわらず、今は外です。 – Jacksonkr