2014-07-15 9 views
6

Sto provando a creare un pulsante con un'icona/forma triangolare. Ho creato il triangolo in Paintcode quindi copiato il percorso del beizer e l'ho aggiunto al livello del pulsante come di seguito.Creazione di una forma triangolare in un UIButton

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

Tuttavia, questo non sembra funzionare. Sto impostando il colore di sfondo di UIButton, quindi so che la cornice è corretta e l'uscita funziona come previsto, ma non aggiunge la forma?

Secondo approccio

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; 

Ciò non ha funzionato neanche.

+0

Prova mascherare lo strato – klcjr89

+0

Se si imposta il 'backgroundColor' del livello di forma, si può confermare che è allineato correttamente all'interno della vista? –

+0

@ troop231 - Vedi il secondo approccio in questione, questo non ha funzionato neanche per me – StuartM

risposta

2

provare quanto segue:

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

Grazie, questo ha fatto il trucco. Ho notato anche uno stupido errore che ho fatto lungo la strada che lo ha risolto ... Troppo tardi la notte, mio ​​male! Grazie – StuartM

+0

Felice che abbia aiutato! Accetta per favore – klcjr89

+0

Devi aspettare 5 minuti, avrai capito :) – StuartM