为什么没有根据我通过的x,y设置绘制线条?

时间:2014-01-28 22:37:33

标签: objective-c ios7 nsdate nsdateformatter

我有一个应用程序,我在其中绘制代表约会的垂直线。他们没有被绘制在我希望他们绘制的地方。以下是当前绘制内容的示例:

enter image description here

这是代码的相关部分,为每个垂直条配置x和y并绘制它:

//  get shop hours from Preferences
NSDate *timeShopOpens;  //  GMT - 8
NSString *completeDateString;
PreferenceData *prefDataFound = [PreferenceData MR_findFirst];
if(prefDataFound)  {
    completeDateString = [NSString stringWithFormat:@"%@ %@",
                          [startDateParts objectAtIndex: 0],prefDataFound.aShopOpens];  //  2014-01-27 1000
    timeShopOpens = [formatter dateFromString:completeDateString];  //  NSDate 2014-01-27 18:00:00 +0000
}

//  compute where to start drawing
NSDateComponents *components = [[NSCalendar currentCalendar]
                                components:NSCalendarUnitMinute
                                fromDate:timeShopOpens toDate:ai.aStartTime  options:0];
float openAndStartMinutesDiff = [components minute];  //  difference between shopOpen time and appt startTime in minutes
float fWhereToStartSegments = (openAndStartMinutesDiff / 15);  //  gives the number of 15-minute segments to begin drawing
float startPosY = 28.0f + (fWhereToStartSegments * 12.5);   //  compute starting point (adjusted for line width)

//  compute duration segments
components = [[NSCalendar currentCalendar]
              components:NSCalendarUnitMinute
              fromDate:ai.aStartTime toDate:ai.aEndTime  options:0];
float startEndDiffMinutes = [components minute];  //  difference between stop and start time in minutes  <--OK
float fDurationSegments = (startEndDiffMinutes / 15);  //  gives the number of 15-minute segments for duration

NSLog(@"\n\nstartPosY: %f\nopenAndStartMinutesDiff: %f\nfDurationSegments: %f",startPosY, openAndStartMinutesDiff, fDurationSegments);

// Start the line at this point (x,y)
float y = startPosY;
CGContextMoveToPoint(currentContext, column, y);

// compute end point  (additional fDurationSegments takes line width into consideration)
CGContextAddLineToPoint(currentContext, column,  startPosY + (fDurationSegments * 12.5) + fDurationSegments);

//  draw the colored line
CGContextSetLineDash(currentContext, 0, nil, 0);  //  reset dashed line to straight line
CGContextSetLineWidth(currentContext, LINE_WIDTH);  // Set the width for the lines

CGContextStrokePath(currentContext);  //  draw 'em

此处列出了相关对象的值,并且具有正确的值:

timeShopOpens: 2014-01-27 18:00:00 +0000
ai.aStartTimeOpens: 2014-01-27 18:15:00 +0000
startPosY: 40.500000
openAndStartMinutesDiff: 15.000000
fDurationSegments: 4.000000
fWhereToStartSegments: 1.000000

问题是:为什么没有正确绘图?


我希望手动创建这样的东西:

image from comments

1 个答案:

答案 0 :(得分:0)

有几点想法:

  1. 就行长而言,您有一行说:

    CGContextAddLineToPoint(currentContext, column,  startPosY + (fDurationSegments * 12.5) + fDurationSegments);
    

    你说你这样做是为了“进入水平线宽”[?],但我不确定你的意思。如果您的行应该是4个段高,如果fDurationSegments4.0,您只需要:

    CGContextAddLineToPoint(currentContext, column,  startPosY + fDurationSegments * 12.5);
    

    但是,使用我的示例startPosY + (4.0 * 12.5) + 4.0,您的代码就会成功。例如,为什么要为您的小时段添加额外的4个点,为90分钟的段添加额外的6个点?我不明白你为什么要在值中添加fDurationSegments,但它是段数的函数,而不是行宽。我一定是在误解你的意图。

  2. 根据您与我们分享的内容,这不太可能是一个问题,但您想要确认您的行上限。您尚未与我们分享CGContextSetLineCap设置,但您肯定希望使用kCGLineCapButt而不是kCGLineCapSquare。我认为这是默认的,但明确设置它可能是谨慎的。如果使用kCGLineCapSquare,则会使线条长于您想要的线条(相当于线条宽度的一半)。无论行宽如何,kCGLineCapButt都会精确指定您指定的长度。

  3. 此外,我不知道您向我们展示的图像是实际的屏幕截图,还是根本没有调整大小,但看起来网格的渲染速度为75.0点/小时。这意味着每个15分钟片段的高度为18.75,而不是12.5。这会影响行长度以及startPosY

    也许你在上传之前调整了图像大小,其中这一点没有实际意义,但是底线,我建议你确认用于渲染条形的比例,用于渲染条形后面的网格。