2014-01-28 35 views
0

我有一個應用程序,我畫垂直線代表約會。他們沒有被繪製在我想要繪製的地方。這裏是目前正在制定什麼樣的例子:爲什麼不按照我通過的x,y設置繪製線條?

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

+0

你可以添加一張圖片,它顯示它應該是什麼樣子?如果我們有可視化參考,則更容易在代碼中找到錯誤。 – Hannes

+0

大聲笑...不能添加它應該看起來像的圖片因爲我無法讓它工作!但是,如果您想象左上角的紅色條,則應該從1015水平線開始,然後下降至1115線。 – SpokaneDude

+0

你可以使用photoshop或其他任何只是給一個粗略的草圖,會使它更容易 – Hannes

回答

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

    也許你在上傳圖片之前調整了圖片的大小,其中該點沒有實際意義,但是底線,我建議您確認用於渲染條形的比例,以及用於在網格後面渲染網格的比例。

+0

順便說一下,如果您的網格確實是75.0點/小時,我可能會建議使用可被4整除的值,例如76.0或80.0。在渲染這15分鐘的細分時,您不太可能會得到不需要的抗鋸齒效果。 – Rob

相關問題