2012-10-06 13 views
6

मैं एक रेखा को आकर्षित करने के लिए कैशपलेयर का उपयोग कैसे करूं जिसमें सीमा रंग, सीमा चौड़ाई और रंग भरें?सीमा के साथ कैशपलेयर और रंग भरने और गोलाकार

यहाँ मैं क्या कोशिश की है, लेकिन यह केवल कभी नीले रंग की है ...

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; 

उत्तर

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

यह मेरा अंतिम समाधान था – jjxtra

7

आप nil या पारदर्शी के अलावा कुछ करने के लिए परत की fillColor गुण सेट करते हैं, तो परत अपने रास्ते भर जाएगा।

यदि आप परत के lineWidth को शून्य से बड़े नंबर पर सेट करते हैं और आप को nil या पारदर्शी के अलावा किसी अन्य चीज़ पर सेट करते हैं, तो परत इसके पथ को स्ट्रोक कर देगी।

यदि आप उन सभी गुणों को सेट करते हैं, तो परत और भर जाएगी। यह भरने के बाद स्ट्रोक खींचता है।

परत के पथ को वास्तव में कुछ भी भरने के लिए कुछ क्षेत्र को संलग्न करना होगा। आपकी पोस्ट में, आप इस तरह के पथ को सेट करते हैं:

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

उस पथ में एक एकल पंक्ति खंड होता है। यह किसी भी क्षेत्र को घेर नहीं करता है, इसलिए परत को भरने के लिए कुछ भी नहीं है।

+0

मैं अपने वर्तमान कोड के साथ अपना प्रश्न अपडेट करता हूं ... – jjxtra

+0

@PsychoDad मैंने अपना जवाब अपडेट किया है। –

+0

तो मुझे अपना पथ बहुभुज होने की आवश्यकता होगी? – jjxtra

1

स्विफ्ट में 3. 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) 
} 
संबंधित मुद्दे