我有一个应用程序,我在其中绘制代表约会的垂直线。他们没有被绘制在我希望他们绘制的地方。以下是当前绘制内容的示例:
这是代码的相关部分,为每个垂直条配置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
问题是:为什么没有正确绘图?
我希望手动创建这样的东西:
答案 0 :(得分:0)
有几点想法:
就行长而言,您有一行说:
CGContextAddLineToPoint(currentContext, column, startPosY + (fDurationSegments * 12.5) + fDurationSegments);
你说你这样做是为了“进入水平线宽”[?],但我不确定你的意思。如果您的行应该是4个段高,如果fDurationSegments
是4.0
,您只需要:
CGContextAddLineToPoint(currentContext, column, startPosY + fDurationSegments * 12.5);
但是,使用我的示例startPosY + (4.0 * 12.5) + 4.0
,您的代码就会成功。例如,为什么要为您的小时段添加额外的4个点,为90分钟的段添加额外的6个点?我不明白你为什么要在值中添加fDurationSegments
,但它是段数的函数,而不是行宽。我一定是在误解你的意图。
根据您与我们分享的内容,这不太可能是一个问题,但您想要确认您的行上限。您尚未与我们分享CGContextSetLineCap
设置,但您肯定希望使用kCGLineCapButt
而不是kCGLineCapSquare
。我认为这是默认的,但明确设置它可能是谨慎的。如果使用kCGLineCapSquare
,则会使线条长于您想要的线条(相当于线条宽度的一半)。无论行宽如何,kCGLineCapButt
都会精确指定您指定的长度。
此外,我不知道您向我们展示的图像是实际的屏幕截图,还是根本没有调整大小,但看起来网格的渲染速度为75.0点/小时。这意味着每个15分钟片段的高度为18.75
,而不是12.5
。这会影响行长度以及startPosY
。
也许你在上传之前调整了图像大小,其中这一点没有实际意义,但是底线,我建议你确认用于渲染条形的比例,用于渲染条形后面的网格。