2014-01-28 2 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

LOL ... 사진을 추가 할 수 없으므로 사진을 찍을 수 없습니다. 그러나, 왼쪽 상단의 빨간색 막대를 상상해 보면 1015 수평선에서 시작하여 1115 줄로 내려 가야합니다. – SpokaneDude

+0

Photoshop을 사용하거나 거친 스케치를 제공하는 것이 무엇이든간에 훨씬 쉽게 만들 수 있습니다. – Hannes

답변

0

몇 : :이 수동으로 만든 연주 같은 것을 얻기 위해 찾고 있어요


라인 길이의 측면에서

  1. 을, 당신은 다음과 같은 내용의 라인 :

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

    "가로 줄 너비"[?]를 사용하기 위해이 작업을 수행한다고하지만, 무슨 뜻인지 확실하지 않습니다.

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

    을하지만 당신의 코드 내 예를 들어, startPosY + (4.0 * 12.5) + 4.0를 사용하여, 그것을 만들 것입니다 : fDurationSegments4.0 인 경우 회선, 4 개 세그먼트 키가 있어야합니다, 당신은 할 수 있습니다. 예를 들어 1 시간 분량의 세그먼트에 대해 추가로 4 점을 추가하고 90 분 분량으로 6 점을 추가하는 이유는 무엇입니까? 나는 왜 당신이 값에 fDurationSegments을 추가하는지 이해하지 못한다. 그러나 선의 너비가 아니라 세그먼트 수의 함수이다. 나는 여기서 당신의 의도를 오해해야합니다.

  2. 당신이 우리와 공유 한 것을 기준으로 할 때 문제가 될 수는 없지만 줄 바꿈을 확인하고 싶습니다. CGContextSetLineCap 설정을 Google과 공유하지 않았지만 kCGLineCapSquare 대신 kCGLineCapButt을 사용하고 싶습니다. 나는 이것이 이것이 디폴트 인 것으로 생각하지만 명시 적으로 설정하는 것이 현명 할 수도있다. kCGLineCapSquare을 사용하면 선이 원하는 길이보다 길어집니다 (선 두께의 절반에 해당하는 양만큼). kCGLineCapButt은 선 너비와 상관없이 지정한 길이로 정확하게 지정합니다.

  3. 또한 우리가 본 이미지가 실제 화면 캡처인지 또는 전혀 크기를 조정했는지는 알 수 없지만 그리드가 75.0pt/시간으로 렌더링 된 것처럼 보입니다. 즉, 각 15 분 세그먼트의 높이는 이 아니라 12.5이됩니다. 이것은 라인 길이와 startPosY에 영향을 미칩니다.

    이미지를 업로드하기 전에 이미지의 크기를 조정했을 가능성이 있습니다. 그 점은 의의가 있지만 결론은 막대 뒤에 격자를 그리는 데 사용한 눈금으로 막대를 렌더링하는 데 사용한 눈금을 확인하는 것이 좋습니다. .

+0

그런데 그리드가 실제로 75.0 pts/hour 인 경우 4로 나눌 수있는 값을 사용하는 것이 좋습니다. 76.0 또는 80.0. 이 15 분짜리 세그먼트를 렌더링 할 때 원하지 않는 앤티 앨리어싱을 얻지는 않습니다. – Rob

관련 문제