2012-10-06 10 views
6

Jak używać CAShapeLayer do rysowania linii, która ma zarówno kolor obramowania, szerokość obramowania i kolor wypełnienia?CashapeLayer z kolorami i zaokrągleniami obramowania i wypełnienia

Oto co próbowałem, ale to zawsze tylko niebieski ...

self.lineShape.strokeColor = [UIColor blueColor].CGColor; 
self.lineShape.fillColor = [UIColor greenColor].CGColor; 
self.lineShape.lineWidth = 100; 
self.lineShape.lineCap = kCALineCapRound; 
self.lineShape.lineJoin = kCALineJoinRound; 
UIBezierPath* path = [UIBezierPath bezierPath]; 
[path moveToPoint:self.lineStart]; 
[path addLineToPoint:self.lineEnd]; 
self.lineShape.path = path.CGPath; 

Odpowiedz

7
self.lineShapeBorder = [[CAShapeLayer alloc] init]; 
    self.lineShapeBorder.zPosition = 0.0f; 
    self.lineShapeBorder.strokeColor = [UIColor blueColor].CGColor; 
    self.lineShapeBorder.lineWidth = 25; 
    self.lineShapeBorder.lineCap = kCALineCapRound; 
    self.lineShapeBorder.lineJoin = kCALineJoinRound; 

    self.lineShapeFill = [[CAShapeLayer alloc] init]; 
    [self.lineShapeBorder addSublayer:self.lineShapeFill]; 
    self.lineShapeFill.zPosition = 0.0f; 
    self.lineShapeFill.strokeColor = [UIColor greenColor].CGColor; 
    self.lineShapeFill.lineWidth = 20.0f; 
    self.lineShapeFill.lineCap = kCALineCapRound; 
    self.lineShapeFill.lineJoin = kCALineJoinRound; 

// ... 

    UIBezierPath* path = [UIBezierPath bezierPath]; 
    [path moveToPoint:self.lineStart]; 
    [path addLineToPoint:self.lineEnd]; 
    self.lineShapeBorder.path = self.lineShapeFill.path = path.CGPath; 
+0

To było moje ostateczne rozwiązanie – jjxtra

7

Jeśli ustawisz warstwy za fillColor własności do czegoś innego niż nil lub przezroczysta warstwa wypełni swoją ścieżkę.

Po ustawieniu warstwy lineWidth na liczbę większą niż zero i ustawieniu jej strokeColor na coś innego niż nil lub przezroczystą, warstwa przesunie się po ścieżce.

Po ustawieniu wszystkich tych właściwości warstwa wypełni i przesunie się po ścieżce. Rysuje obrys po wypełnieniu.

Ścieżka warstwy musi faktycznie obejmować jakiś obszar, aby mógł wypełnić cokolwiek. W swoim poście ustawiamy następującą ścieżkę:

UIBezierPath* path = [UIBezierPath bezierPath]; 
[path moveToPoint:self.lineStart]; 
[path addLineToPoint:self.lineEnd]; 
self.lineShape.path = path.CGPath; 

Ścieżka zawiera pojedynczy segment linii. Nie obejmuje żadnego obszaru, więc warstwa nie ma nic do wypełnienia.

+0

aktualizować moje pytanie z mojego obecnego kodu ... – jjxtra

+0

@PsychoDad I zostały zaktualizowane moją odpowiedź. –

+0

Więc potrzebowałbym, aby moja ścieżka była wielokątem? – jjxtra

1

W Swift 3. metoda rozszerzenia UIView.

// Usage: 
self.btnGroup.roundCorner([.topRight, .bottomRight], radius: 4.0, borderColor: UIColor.red, borderWidth: 1.0) 

// Apply round corner and border. An extension method of UIView. 
public func roundCorner(_ corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { 
    let path = UIBezierPath.init(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) 

    let mask = CAShapeLayer() 
    mask.path = path.cgPath 
    self.layer.mask = mask 

    let borderPath = UIBezierPath.init(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) 
    let borderLayer = CAShapeLayer() 
    borderLayer.path = borderPath.cgPath 
    borderLayer.lineWidth = borderWidth 
    borderLayer.strokeColor = borderColor.cgColor 
    borderLayer.fillColor = UIColor.clear.cgColor 
    borderLayer.frame = self.bounds 
    self.layer.addSublayer(borderLayer) 
} 
Powiązane problemy