2014-07-15 29 views
6

Próbuję utworzyć przycisk z ikoną trójkąta/kształtem. Utworzono trójkąt w Paintcode, a następnie skopiowałem ścieżkę Beizer i dodałem ją do warstwy przycisków jak poniżej.Tworzenie kształtu trójkąta w UIButtonie

-(void)setupShowHideRouteButton { 
    UIBezierPath* bezierPath = UIBezierPath.bezierPath; 
    [bezierPath moveToPoint: CGPointMake(10.5, 8.5)]; 
    [bezierPath addCurveToPoint: CGPointMake(40.5, 8.5) controlPoint1: CGPointMake(39.5, 8.5) controlPoint2: CGPointMake(40.5, 8.5)]; 
    [bezierPath addLineToPoint: CGPointMake(26.39, 22.3)]; 
    [bezierPath addLineToPoint: CGPointMake(25.2, 23.5)]; 
    [bezierPath addLineToPoint: CGPointMake(10.5, 8.5)]; 
    [UIColor.blackColor setStroke]; 
    bezierPath.lineWidth = 1; 
    [bezierPath stroke]; 

    CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
    shapeLayer.frame = self.showHideRouteViewBtn.bounds; 
    shapeLayer.path = bezierPath.CGPath; 
    shapeLayer.fillColor = [UIColor clearColor].CGColor; 
    shapeLayer.strokeColor = [UIColor blackColor].CGColor; 
    shapeLayer.lineWidth = 2; 
    [self.showHideRouteViewBtn.layer addSublayer:shapeLayer]; 
} 

To jednak nie działa. Ustawiam kolor tła UIButton, więc wiem, że ramka jest poprawna, a wylot działa zgodnie z oczekiwaniami, ale nie dodaje kształtu?

Drugie podejście

UIBezierPath* bezierPath = UIBezierPath.bezierPath; 
[bezierPath moveToPoint: CGPointMake(10.5, 8.5)]; 
[bezierPath addCurveToPoint: CGPointMake(40.5, 8.5) controlPoint1: CGPointMake(39.5, 8.5) controlPoint2: CGPointMake(40.5, 8.5)]; 
[bezierPath addLineToPoint: CGPointMake(26.39, 22.3)]; 
[bezierPath addLineToPoint: CGPointMake(25.2, 23.5)]; 
[bezierPath addLineToPoint: CGPointMake(10.5, 8.5)]; 
[UIColor.blackColor setStroke]; 
bezierPath.lineWidth = 1; 
[bezierPath stroke]; 

// Create a mask layer and the frame to determine what will be visible in the view. 
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
CGRect maskRect = self.showHideRouteViewBtn.bounds; 

// Create a path with the rectangle in it. 
CGPathRef path = CGPathCreateWithRect(maskRect, NULL); 

// Set the path to the mask layer. 
maskLayer.path = bezierPath.CGPath; 

// Release the path since it's not covered by ARC. 
CGPathRelease(path); 

// Set the mask of the view. 
self.showHideRouteViewBtn.layer.mask = maskLayer; 

to nie działało.

+0

Spróbuj maskowania warstwę – klcjr89

+0

Jeśli ustawisz 'backgroundColor' warstwy kształtu, można potwierdzić, że jest prawidłowo ustawiony wewnątrz widoku? –

+0

@ troop231 - Zobacz drugie podejście, o którym mowa, to nie zadziałało dla mnie albo – StuartM

Odpowiedz

2

Spróbuj wykonać następujące czynności:

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.frame = self.showHideRouteViewBtn.bounds; 
shapeLayer.path = bezierPath.CGPath; 
shapeLayer.fillColor = [UIColor clearColor].CGColor; 
shapeLayer.strokeColor = [UIColor blackColor].CGColor; 
shapeLayer.lineWidth = 2; 
self.showHideRouteViewBtn.layer.mask = shapeLayer; 
+0

Dzięki, że załatwiłeś sprawę. Zauważyłem też głupi błąd, który popełniłem po drodze, która go rozwiązała ... Za późno w nocy, moja zła! Dzięki – StuartM

+0

Cieszę się, że pomogło! Zaakceptuj proszę – klcjr89

+0

Muszę poczekać 5 minut, dostaniesz to :) – StuartM