2013-01-10 6 views
5

코어 그래픽을 사용하면 패스 내부를 칠할 수 있습니까? 반대로 외부에 반은 그려지고 선은 안쪽에 반으로 그려지는 것과는 대조적으로?UIView drawRect : 패스 내부를 칠할 수 있습니까?

보기의 일부가 화면 가장자리에 있고 일부는 그렇지 않은 경우 스트로크의 가시적 인 두께를 제어하는 ​​것이 더 쉬울 수있는 이유는 그 때문입니다. 화면 가장자리 부분이 잘리는 반면 화면 가장자리가 두껍게 보입니다 (획이 보이는 경우 양쪽면). 당신이 이전에 경로에

enter image description here

답변

10

클립을 스트로크.

+0

감사합니다! 위의 "대답"을보고 댓글을 달 수 있습니까? 이 방법은 효과가 없습니다. 그 스트로크는 전혀 그려지지 않습니다. path to clip, 메소드 이름은 무엇입니까? – Mrwolfy

+0

끝났습니다. ['CGContextClip()'에 대한 문서 (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextClip) : "새 클리핑 패스를 결정한 후이 함수는 컨텍스트의 현재 경로를 빈 경로로 재설정합니다." 그래서 CGContextDraw가 아무 것도 그리지 않는 이유를 설명합니다. 스트로크하기 전에 컨텍스트에 경로를 다시 추가해야합니다. –

+0

['CGPath'] (https://developer.apple.com/library/ios/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html#//apple_ref/c/tdef/CGPathRef) 또는 [ 'UIBezierPath'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html)을 사용하면 프로세스를 더 쉽게 만들 수 있습니다. 경로를 한 번 생성 한 다음 두 번이나. –

6

이것은 획을 그립니다 없습니다 :

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect), CGRectGetHeight(rect)); 
    CGFloat radius = 30; 
    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect); 
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
    CGContextClip(context); 
    CGContextDrawPath(context, kCGPathStroke); 
} 

편집 : 이것은 (정답에 따라) 일 것입니다 :

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 
    CGContextSetLineWidth(context, 14); 
    CGRect pathRect = CGRectMake(10, 10, rect.size.width -20, rect.size.height -20); 
    CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:pathRect cornerRadius:20].CGPath; 
    CGContextAddPath(context, path); 
    CGContextClip(context); 
    CGContextAddPath(context, path); 
    CGContextDrawPath(context, kCGPathEOFillStroke); 

}