Objective c 为什么不根据我通过的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

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

这是代码的相关部分,用于为每个垂直条配置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
问题是:为什么画得不对


我希望得到类似以下手动创建的格式副本:

有几点想法:

  • 就行长而言,有一行表示:

    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将使其精确到您指定的长度,而不考虑线宽

  • 另外,我不知道你给我们看的图像是不是真实的屏幕截图,或者你是否调整了它的大小,但看起来网格的渲染速度是75.0分/小时。这意味着每段15分钟的高度将是
    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);