2010-02-01 3 views
1

커스텀 UITableViewCell 배경에 사용하는 둥근 모서리가있는 그라디언트가 있습니다. 나는 경로에 뇌졸중을 적용하려고하지만 아주 할 수 없어, 내가 어디로 잘못 가고 있는지 알 수 없습니다.코어 그래픽에서 둥근 사각형에 획 적용하기

이 코드는 직사각형을 오른쪽으로 반올림하고 그라데이션을 적용하지만 행을 획상 표시하지 않습니다. 내 실수는 어디 갔지?



편집

alt text http://grab.by/26Ye

: subw의 권고 사항에 따라
, 내가 할 코드를 변경 :

CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef myGradient = nil; 
    CGFloat components[8] = TABLE_CELL_BACKGROUND; 
    CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]); 
    CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]); 
    CGContextSetLineWidth(c, 2); 

    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny ; 

    maxx = maxx - 1; 
    maxy = maxy - 1; 

    CGContextMoveToPoint(c, minx, miny); 
    CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin); 
    CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin); 
    CGContextAddLineToPoint(c, maxx, miny); 
    CGContextAddLineToPoint(c, minx, miny); 

    // Fill and stroke the path 
    CGContextSaveGState(c); 
    CGContextClip(c); 

    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND; 
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2); 
    CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

    CGContextRestoreGState(c); 
    CGContextStrokePath(c); 

그러나 RECT는 ... 이런 식으로 나오는

alt text http://grab.by/2714

... 테두리 없음. CGContextStrokePath(c)CGContextStrokeRect(c, rect)으로 변경하면 스트로크가 표시됩니다 (설명을 위해 빨간색으로 나타남). 그러나 경로를 쓰다듬어 때 어떻게 든, 나는 :(이

alt text http://grab.by/27aM

답변

5

, 나는이 문서 인용 : 현재 경로와는 달리

를, 현재의 클리핑 경로는 그래픽 상태의 일부입니다. 따라서 클리핑 경로를 이전 상태로 복원하여 페인트 가능 영역을 다시 확대하려면 클리핑 된 도면을 완료 한 후에 그래픽 상태를 클립하고 복원하기 전에 그래픽 상태를 저장해야합니다.

새 클리핑 경로를 결정한 후 함수는 컨텍스트의 현재 경로를 빈 경로로 재설정합니다.

-CGContextClip

그래서, 현재 도면 경로는 그래픽 상태의 하지 부분이다.그래서 여기 당신이 무슨 일을하는지입니다 :

  1. 빌드 그리기 경로
  2. 저장 GSTATE
  3. 클리핑 패스에 현재 도면 경로를 추가;

이 솔루션은 CGPath 객체로의 경로를 그릴 것입니다

  • 스트로크 아무것도; 분명 현재 도면 경로
  • 그라데이션
  • 복원 GSTATE 그리기 (클리핑 그리기 빈 남아 이전 클리핑 경로 복원) 그런 다음 클리핑 (gstate를 저장 한 후)과 스트로 킹 (stroking) 전에 모두 현재 경로로 추가하십시오.

    외부 스트로크, 내부 스트로크 또는 가운데 맞춤 스트로크를 결정해야합니다. 중앙 집중 스트로크의 경우 스트로크하지 않는 동안 스트로크합니다. 내부 스트로크의 경우 스트로크 동안 스트로크. 외부 스트로크의 경우 패스를 반대로 한 다음 클립을 누른 다음 획을 지정합니다. 마지막 두 양식 모두에 대해 선 너비를 두 배로 늘리려는 경우 획의 절반을 잘라내야합니다.

    CGContextStrokePath(c)CGContextStrokeRect(c, rect)으로 변경하면 스트로크가 나타납니다.

    이 함수는 스트로 킹하기 전에 현재 그리기 경로에 해당 사각형의 경로를 추가하기 때문에.

  • +0

    클리핑 경로를 설정할 때 현재 경로가 지워지지 않는 이유는 무엇입니까? CGContextClip에 대한 문서에는이 내용이 언급되어 있지 않습니다. – mrueg

    +0

    subw : 가능합니다. "새로운 클리핑 경로를 결정한 후이 함수는 컨텍스트의 현재 경로를 빈 경로로 재설정합니다."포스트 스크립트 (PDF의 직계 조상)가이를 수행하기 때문에이 작업이 수행됩니다. –

    +0

    의미가 있습니다. 오늘 밤에 이걸 시험해 보겠습니다. – coneybeare

    0

    확실하지 않음 스트로크를 받고 있지 않다,하지만 어쩌면 당신은 스트로크를 통해 기울기를 칠거야?

    +0

    나는 그렇게 생각하지 않는다. 업데이트 된 코드에서 그래디언트 다음에 획을 그리는 중입니다. – coneybeare

    0

    넌 어느 그리기 .

    CGContextSaveGState(c); 
    CGContextClip(c); 
    
    //gradient drawing stuff 
    
    CGContextRestoreGState(c); 
    CGContextStrokePath(c); 
    

    : 스트로크 이상 구배, 및/또는 지역 당신 스트로크를 클리핑

    나는 다음이 더 잘 작동 것 같아요 물론 획 색상과 너비도 올바르게 설정해야합니다. 수정 된 코드에 대응

    +0

    이 작업을 수행 할 것이라고 생각했지만 작동하지 않을 것이라고 생각했습니다. http://grab.by/2714 – coneybeare

    +0

    질문 : CGContextBeginPath (c) 어딘가에 호출이 있습니까? 그렇지 않은 경우 문제가 될 수 있습니다. – mrueg

    +0

    나는 그렇지 않습니다. 셀을 그리는 코드의이 섹션 전에 무엇을 가지고 있는지 보여주기 위해 코드를 업데이트했습니다. – coneybeare

    관련 문제