Objective c 为什么不根据我通过的x、y设置绘制直线?
我有一个应用程序,我画垂直线代表约会。他们没有被画在我想画的地方。以下是当前绘制内容的示例: 这是代码的相关部分,用于为每个垂直条配置x和y并绘制它:Objective c 为什么不根据我通过的x、y设置绘制直线?,objective-c,ios7,nsdate,nsdateformatter,Objective C,Ios7,Nsdate,Nsdateformatter,我有一个应用程序,我画垂直线代表约会。他们没有被画在我想画的地方。以下是当前绘制内容的示例: 这是代码的相关部分,用于为每个垂直条配置x和y并绘制它: // get shop hours from Preferences NSDate *timeShopOpens; // GMT - 8 NSString *completeDateString; PreferenceData *prefDataFound = [PreferenceData MR_findFirst]; if(prefD
// 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
问题是:为什么画得不对
我希望得到类似以下手动创建的格式副本: 有几点想法:
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
。举例来说,为什么要在一小时的节目中多加四分,在90分钟的节目中多加六分?我不明白为什么要在值中添加fDurationSegments
,但它是段数的函数,而不是线宽。我一定是误解了你的意图CGContextSetLineCap
设置,但您肯定希望使用kglinecapbutt
而不是kglinecapsquare
。我认为这是默认设置,但明确设置它可能是明智的。如果使用kCGLineCapSquare
它将使线条比您想要的长(长度等于线条宽度的一半)<代码>kCGLineCapButt将使其精确到您指定的长度,而不考虑线宽18.75
,而不是12.5
。这将影响行长度和startPosY
也许您在上传图像之前调整了图像的大小,这一点是没有意义的,但底线是,我建议您确认用于渲染条形图的比例,以及用于渲染条形图后面网格的比例你能在上面加一张图片吗?如果我们有可视化的参考,那么在代码中定位错误就更容易了。。。无法添加它应该是什么样子的图片,因为我无法让它工作!但是,如果你想象左上角的红色条,它应该从1015水平线开始,一直延伸到1115线。你可以使用photoshop或其他工具来绘制一个粗略的草图,这将使它变得更容易。很难判断出什么是错的,因为你向我们展示了一张你似乎正确绘制了一组条的图片,但请告诉我们,这张画得不对。但你没有告诉我们有什么问题。根本不出现?出现在错误的地方?除此之外,行
CGContextAddLineToPoint(当前上下文、列、startPosY+(fDurationSegments*12.5)+fDurationSegments)代码>看起来很可疑。如果每个段的高度为12.5磅,为什么还要再次添加fDurationSegments
?顺便说一句,如果网格实际为75.0磅/小时,我建议使用一个可被四整除的值,例如76.0或80.0。在渲染这些15分钟的片段时,不太可能获得不需要的抗锯齿效果。
CGContextAddLineToPoint(currentContext, column, startPosY + fDurationSegments * 12.5);