Iphone 如何缩放图形以适应可见空间

Iphone 如何缩放图形以适应可见空间,iphone,core-plot,Iphone,Core Plot,我使用核心图(和条形图)来显示财务信息 我的问题是,每当我使用负值时,所示图形的比例似乎是错误的。我希望整个图形都是可见的,但通常只显示图形的一部分,使条形图被切断,有时甚至看不到x轴(显示的部分在y轴的下方)。如果我打开用户交互,可以在视图中滚动查看图形的不同部分,但我想要的是概述,而不是详细研究图形。请注意,我没有将整个屏幕用于图形,但仅使用大约300x240px 由于某些原因,新用户不允许发布图像,因此我无法附加屏幕截图。如果有人认为这有助于回答问题(并且有时间),我很乐意向您发送两个截图

我使用核心图(和条形图)来显示财务信息

我的问题是,每当我使用负值时,所示图形的比例似乎是错误的。我希望整个图形都是可见的,但通常只显示图形的一部分,使条形图被切断,有时甚至看不到x轴(显示的部分在y轴的下方)。如果我打开用户交互,可以在视图中滚动查看图形的不同部分,但我想要的是概述,而不是详细研究图形。请注意,我没有将整个屏幕用于图形,但仅使用大约300x240px

由于某些原因,新用户不允许发布图像,因此我无法附加屏幕截图。如果有人认为这有助于回答问题(并且有时间),我很乐意向您发送两个截图,说明它在只有正值的情况下的外观以及在负值的情况下的外观

我真的很感激能得到的任何帮助。多谢各位

我用于生成图形的代码如下:

- (id)initWithFrame:(CGRect)frame:(FinancialTopicData *) topicDataToSet:(NSArray *) colors {

//Assert correct data
assert([topicDataToSet isKindOfClass:[FinancialTopicData class]]);

if ((self = [super initWithFrame:frame])) {

    self.topicData = topicDataToSet;

    //Create the graph
    graph = [[CPXYGraph alloc] initWithFrame:CGRectZero];

    CPTheme *theme = [CPTheme themeNamed:kCPPlainWhiteTheme];
    [graph applyTheme:theme];
    self.hostedLayer = graph;

    // Border
    graph.plotAreaFrame.borderLineStyle = nil;
    graph.plotAreaFrame.cornerRadius = 0.0f;

    // Paddings
    graph.paddingLeft = 0.0f;
    graph.paddingRight = 0.0f;
    graph.paddingTop = 0.0f;
    graph.paddingBottom = 0.0f;
    graph.titlePlotAreaFrameAnchor = CPRectAnchorTop;

    //Plot padding
    graph.plotAreaFrame.paddingLeft = 70.0;
    graph.plotAreaFrame.paddingTop = 10;
    graph.plotAreaFrame.paddingRight = 20.0;
    graph.plotAreaFrame.paddingBottom = 45.0;

    NSDecimalNumber *intervalDivider = [NSDecimalNumber decimalNumberWithString:@kIntervalDivider];

    // Add plot space for horizontal bar charts
    NSDecimalNumber *numberDecimalValueMaxUp = [[topicData maxValueRoundedUp] decimalNumberByAdding:[[[topicData maxValueRoundedUp] decimalNumberBySubtracting:[topicData minValueRoundedDown]] decimalNumberByDividingBy:intervalDivider]];
    NSDecimal decimalValueMaxUp = [numberDecimalValueMaxUp decimalValue];
    NSDecimal decimalValueMinDown = [[topicData minValueRoundedDown] decimalValue];
    NSInteger numberOfTypes = [[topicData years] count];
    NSDecimal numberOfBars = [[NSNumber numberWithInteger:numberOfTypes] decimalValue];
    NSDecimalNumber *yInterval = [[numberDecimalValueMaxUp decimalNumberBySubtracting:[topicData minValueRoundedDown]] decimalNumberByDividingBy:intervalDivider];

    CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;

    plotSpace.yRange = [CPPlotRange plotRangeWithLocation:decimalValueMinDown   length:decimalValueMaxUp];

    plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:numberOfBars];


    //Add x-axis
    CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
    CPXYAxis *x = axisSet.xAxis;
    x.majorTickLineStyle = nil;
    x.minorTickLineStyle = nil;
    x.majorIntervalLength = CPDecimalFromString(@"1");
    x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");

    // Define some custom labels for the data elements
    x.labelRotation = M_PI/4;
    x.labelingPolicy = CPAxisLabelingPolicyNone;


    NSMutableArray *customTickLocations = [NSMutableArray new];
    NSArray *xAxisLabels = [topicData years];

    for(int i = 0; i < [xAxisLabels count];i++){
        [customTickLocations addObject:[NSDecimalNumber numberWithFloat:0.5f+i*1.0f]];
    }

    NSUInteger labelLocation = 0;
    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];

    for (NSNumber *tickLocation in customTickLocations) {

        CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
        newLabel.tickLocation = [tickLocation decimalValue];
        newLabel.offset = x.labelOffset + x.majorTickLength*(numberOfTypes/2);
        newLabel.rotation = M_PI/4;
        [customLabels addObject:newLabel];
        [newLabel release];
    }

    x.axisLabels =  [NSSet setWithArray:customLabels];

    [customTickLocations release];

    CPXYAxis *y = axisSet.yAxis;
    y.minorTickLineStyle = nil;
    y.majorIntervalLength = [yInterval decimalValue];
    y.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");

    int i = 0;

    for(NSString *key in [topicData types]){

        CPBarPlot *barPlot = [CPBarPlot tubularBarPlotWithColor:[colors objectAtIndex:(i%[colors count])] horizontalBars:NO];
        i++;

        barPlot.baseValue = CPDecimalFromString(@"0");
        barPlot.dataSource = topicData;
        barPlot.barOffset = 1.0f+i;
        barPlot.identifier = key;
        barPlot.delegate = topicData;
        barPlot.needsDisplayOnBoundsChange = YES;    

        [graph addPlot:barPlot toPlotSpace:plotSpace];
    }


}
return self;
}
-(NSNumber *)numberForPlot:(CPPlot *)plot 
                 field:(NSUInteger)fieldEnum 
           recordIndex:(NSUInteger)index  {
NSNumber *num = nil;    
if ( [plot isKindOfClass:[CPBarPlot class]] ) {                        
    switch ( fieldEnum ) {
        case CPBarPlotFieldBarLocation:{
            num = [NSDecimalNumber numberWithUnsignedInteger:index];
            break;
        }    
        case CPBarPlotFieldBarLength:{
            NSString *stringValue = [[[types objectForKey:plot.identifier] objectForKey:[years objectAtIndex:index]] objectForKey:KEY_COMPANY_FINANCIALS_VALUE];                
            num = [formatter numberFromString:stringValue];
           break;
        }
    }
}
return num;
}


-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot{
return [years count];
}

plotSpace.yRange
的长度应该是
decimalValueMaxUp
decimalValueMinDown
之间的差值