2013-01-10 10 views
5

Z podstawową grafiką, czy możliwe jest przesuwanie wewnątrz ścieżki? W odróżnieniu od tego, czy waga linii jest narysowana w połowie na zewnątrz, a połowa po wewnętrznej stronie obrysowanej ścieżki?UIView drawRect: czy możliwe jest uderzenie w ścieżkę?

Powód, dla którego łatwiej byłoby kontrolować widoczną grubość obrysu, jeśli część widoku jest na krawędzi ekranu, a część nie. Część na krawędzi ekranu zostanie obcięta, a krawędź widoku, która jest w całości na ekranie, wygląda na grubszą (jak obie strony, jeśli skok jest widoczny).

enter image description here

Odpowiedz

10

Klip na ścieżkę przed wami udaru go.

+0

Dzięki! Czy możesz spojrzeć na moją "odpowiedź" powyżej i skomentować. Ta metoda nie działa. Udar nie rysuje się wcale. Co to jest klip do ścieżki, nazwa metody? – Mrwolfy

+0

Jesteś blisko. [Dokumentacja dla 'CGContextClip()'] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextClip) mówi : "Po określeniu nowej ścieżki obcinania funkcja resetuje bieżącą ścieżkę kontekstu do pustej ścieżki." To wyjaśnia, dlaczego 'CGContextDraw' nic nie rysuje - musisz ponownie dodać ścieżkę do kontekstu, zanim zaczniesz rysować. –

+0

Korzystanie z ['CGPath'] (https://developer.apple.com/library/ios/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html#//apple_ref/c/tdef/CGPathRef) lub [ 'UIBezierPath'] (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html) ułatwiłoby ten proces - można utworzyć ścieżkę raz, a następnie użyć to dwa razy. –

6

Rysuje bez obrysu:

- (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); 
} 

EDIT: To jest to, co działało (zgodnie z prawidłową odpowiedź):

- (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); 

} 
Powiązane problemy