Objective c 在x轴上移动日期

Objective c 在x轴上移动日期,objective-c,datetime,dynamic,core-plot,Objective C,Datetime,Dynamic,Core Plot,我一直在玩核心情节,并试图创建一个动态的日期x轴。从date plot示例中,我成功创建了一个静态日期轴,但希望随时创建一个两分钟的窗口并更新xRange值。我不确定如何将日期传递为xRange最小值和长度值,以及如何在x轴上显示时间 我已经看了一些例子,但是我还不能利用NSTimeInterval(如果是这样做的话…) 下面是图片(如果有帮助的话) 以下是我迄今为止的尝试;有人能告诉我如何做到这一点吗 - (void)loadView { // Alloc & Init Main V

我一直在玩核心情节,并试图创建一个动态的日期x轴。从date plot示例中,我成功创建了一个静态日期轴,但希望随时创建一个两分钟的窗口并更新xRange值。我不确定如何将日期传递为xRange最小值和长度值,以及如何在x轴上显示时间

我已经看了一些例子,但是我还不能利用
NSTimeInterval
(如果是这样做的话…)

下面是图片(如果有帮助的话)

以下是我迄今为止的尝试;有人能告诉我如何做到这一点吗

- (void)loadView {
// Alloc & Init Main View and since the display resolution is 1024x768 take 20 off for labels later
UIView *tmpView = [ [ UIView alloc ] initWithFrame:CGRectMake(0, 0, 1024.0,768.0) ];
[ tmpView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ];
[ tmpView setBackgroundColor:[ UIColor redColor ] ];

// Alloc Graph View
graphView = [ [ CPGraphHostingView alloc ] initWithFrame:CGRectMake(0, 0, 1024.0,768.0) ];
[ tmpView addSubview:[ graphView autorelease ] ];

// Set MainView
[ self setView:[ tmpView autorelease ] ];

}

-(void)viewDidLoad{
[super viewDidLoad];

NSDate *refDate = [NSDate date];

//  NSTimeInterval oneDay = 24 * 60 * 60;
NSTimeInterval oneHour =  60 * 60;
NSTimeInterval fivemin= 5 * 60;
// Create graph from theme
graph = [(CPXYGraph *) [CPXYGraph alloc] initWithFrame:self.view.bounds];

CPTheme *theme = [CPTheme themeNamed:kCPDarkGradientTheme];
[graph applyTheme:theme];
graphView.hostedGraph = graph;

//padding
graph.paddingLeft = 20.0;
graph.paddingTop = 20.0;
graph.paddingRight = 20.0;
graph.paddingBottom = 20.0;

graph.plotAreaFrame.paddingTop=10.0;
graph.plotAreaFrame.paddingLeft=50.0;
graph.plotAreaFrame.paddingRight=35.0;
graph.plotAreaFrame.paddingBottom=50.0;

// Setup scatter plot space
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
NSTimeInterval xLow = 0.0f;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(xLow) length:CPDecimalFromFloat(oneHour)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:CPDecimalFromFloat(100.0f)];

//Line Styles
CPLineStyle *lineStyle = [CPLineStyle lineStyle];
lineStyle.lineColor = [CPColor redColor];
lineStyle.lineWidth = 2.0f;
CPLineStyle *majorGridLineStyle = [CPLineStyle lineStyle];
majorGridLineStyle.lineWidth = 0.75;
majorGridLineStyle.lineColor = [[CPColor colorWithGenericGray:0.2] colorWithAlphaComponent:0.75];
CPLineStyle *minorGridLineStyle = [CPLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.25;
minorGridLineStyle.lineColor = [[CPColor whiteColor] colorWithAlphaComponent:0.1];   

CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;


// X-Axes formatting
CPXYAxis *x = axisSet.xAxis;
x.majorIntervalLength = CPDecimalFromFloat(oneHour);
x.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
x.minorTicksPerInterval = 0;
x.labelOffset=0;
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateStyle = kCFDateFormatterShortStyle;
CPTimeFormatter *timeFormatter = [[[CPTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
timeFormatter.referenceDate = refDate;
x.labelFormatter = timeFormatter;
x.majorGridLineStyle = majorGridLineStyle;
x.minorGridLineStyle = minorGridLineStyle;
x.title=@"Time Axis";


//Y-Axes formatting
CPXYAxis *y = axisSet.yAxis;
y.majorIntervalLength = [ [ NSDecimalNumber decimalNumberWithString:@"10.0" ] decimalValue ];
y.orthogonalCoordinateDecimal = CPDecimalFromString(@"0");
y.minorTicksPerInterval = 5;
y.labelOffset = 0.0;  
y.majorGridLineStyle = majorGridLineStyle;
y.minorGridLineStyle = minorGridLineStyle;
y.preferredNumberOfMajorTicks = 10;
y.minorTickLineStyle = nil;
y.labelTextStyle = nil;
y.visibleRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0.0f) length:CPDecimalFromFloat(100.0f)];
CPConstraints yConstraints = {CPConstraintFixed, CPConstraintFixed};
y.isFloatingAxis=YES;
y.constraints=yConstraints;


// Create a plot that uses the data source method
CPScatterPlot *dataSourceLinePlot = [[[CPScatterPlot alloc] init] autorelease];
dataSourceLinePlot.identifier = @"Date Plot";
dataSourceLinePlot.dataLineStyle = lineStyle;
dataSourceLinePlot.dataSource = self;

[graph addPlot:dataSourceLinePlot];

mydata = [[NSMutableArray alloc]initWithObjects:
          [NSDecimalNumber numberWithInt:0],
          nil ];
//a timer to re-load the graph every 2 seconds and re-draw x-axis 

Timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(testingTimer:) userInfo:nil repeats:YES];

 }


 -(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot
{
return mydata.count;
 }

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
switch ( fieldEnum ) {
    case CPScatterPlotFieldX:
        return (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
    case CPScatterPlotFieldY:
        return [mydata objectAtIndex:index];
}
return nil;
}


-(void) testingTimer: (NSTimer *) Timer{

//generating random number and add to mydata array
testdata=arc4random() % 100;
[mydata addObject:[NSNumber numberWithInt:testdata]];

[graph reloadData];
count++;
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(count) length:CPDecimalFromFloat(5*30.0f)];

}

xRange的位置是您希望绘图开始的位置,例如,如果您为绘图加载了5分钟(假设每秒1个条目)的数据,并且您希望在第3分钟开始,那么您的位置将是3*60。如果只想显示2分钟的数据,则长度始终为2*60


您可能还需要更改x.majorIntervalLength,该值控制沿x轴放置主刻度的频率。您的主刻度通常有一个与之关联的标签,因此您希望将该值降低到更适合2分钟数据的值

@andrew lattis感谢我现在可以看到X轴移动,但我再也看不到实际图形了(我可以看到y轴上的点,但看不到线本身)。但是,如果我为位置提供常量值,我可以看到折线图,在xRange中实现count++是错误的方法吗?值是否在y轴范围之外?在原始注释中的代码中,您将y轴范围设置为0-100,您的值是否都适合该范围?听起来它们可能高于/低于可见范围值肯定在0和100之间,我可以在yaxis线上看到图形(x=0),但它不在实际图形上,而且如果我将xrange plotwithLocation值设置为0.0f,我可以看到图形(但正如您所期望的,x轴不会移动)ok,现在您添加了图像,这就更有意义了。您是否记录了mydata对象以查看其是否正确添加到?@andrew Lattis mydata数组每秒添加一个对象(来自NSTimer调用),但我只存储y值(不是时间)。这可能是问题所在吗?另外,我读了一些在修改之前需要复制xRange的地方?(我也试过了,但没有成功)