2013-08-21 6 views
11

मैं एक गोलाकार कोने और स्ट्रोक/सीमा के साथ एक लेबल (या उस मामले के लिए कोई अन्य दृश्य) बनाने की कोशिश कर रहा हूं। मैं निम्नलिखित कोड का उपयोग कर पूर्व प्राप्त कर सकते हैं:आईओएस में स्ट्रोक मास्क किए गए कैलियर

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.label.bounds 
             byRoundingCorners:UIRectCornerBottomRight 
              cornerRadii:CGSizeMake(16.0f, 16.0f)]; 

CAShapeLayer *shape = [CAShapeLayer layer]; 
shape.frame = self.label.bounds; 
shape.path = maskPath.CGPath; 

self.label.layer.mask = shape; 

कौन सा गोल कोने के लिए अच्छा काम करता है, लेकिन निम्नलिखित कोड का उपयोग कर स्ट्रोक तरह से मैं चाहता हूँ लागू नहीं होता। self.label के को सेट करने के बजाय वर्ग सीमा के लिए एक काला (या जो भी backgroundColor) सेट किया गया है।

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.label.bounds 
             byRoundingCorners:UIRectCornerBottomRight 
              cornerRadii:CGSizeMake(16.0f, 16.0f)]; 

CAShapeLayer *shape = [CAShapeLayer layer]; 
shape.frame = self.label.bounds; 
shape.path = maskPath.CGPath; 

// Add stroke 
shape.borderWidth = 1.0f; 
shape.borderColor = [UIColor whiteColor].CGColor; 

self.label.backgroundColor = [UIColor blackColor]; 
self.label.layer.mask = shape; 

कैसे मैं एक मनमाना रंग स्ट्रोक कि नकाबपोश पथ का अनुसरण आवेदन कर सकते हैं पर कोई सुझाव?

उत्तर

35

आप आकार परत के साथ सही रास्ते पर हैं। लेकिन आपके पास दो अलग-अलग परतें होनी चाहिए। सबसे पहले मुखौटा परत जो आपके पहले उदाहरण में है (आपके क्षेत्र को कटौती करता है जो आप दृश्यमान नहीं दिखाना चाहते हैं)

फिर आप आकृति परत भी जोड़ते हैं, लेकिन मुखौटा परत के रूप में नहीं। साथ ही, सीमावर्ती और सीमा रंग का उपयोग न करें, लेकिन स्ट्रोक करें।

// 
// Create your mask first 
// 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.label.bounds 
             byRoundingCorners:UIRectCornerBottomRight 
              cornerRadii:CGSizeMake(16.0f, 16.0f)]; 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = self.label.bounds; 
maskLayer.path = maskPath.CGPath; 
self.label.layer.mask = maskLayer;  

// 
// And then create the outline layer 
// 
CAShapeLayer *shape = [CAShapeLayer layer]; 
shape.frame = self.label.bounds; 
shape.path = maskPath.CGPath; 
shape.lineWidth = 3.0f; 
shape.strokeColor = [UIColor whiteColor].CGColor; 
shape.fillColor = [UIColor clearColor].CGColor; 
[self.label.layer addSublayer:shape]; 

ध्यान रखें कि आपका स्ट्रोक परत पथ मास्क के पथ के अंदर (छोटे से) होना चाहिए। अन्यथा, स्ट्रोक पथ मास्क परत से दूर मुखौटा जाएगा। मैंने लाइन सेट की है 3 के साथ जो इसे बनाता है ताकि आप चौड़ाई (1.5 पीएक्स) का आधा देख सकें, और दूसरा आधा मुखौटा के बाहर होगा।

+0

यही काम करता है की तरह है, लेकिन अब लेबल का पाठ 'आकार' परत से ढका हुआ है :( –

+1

ठीक है, मैंने इसे 'UIView' पर मुखौटा लगाने और' UILabel' को उप-दृश्य के रूप में जोड़कर काम करने में कामयाब रहा है। बहुत बहुत धन्यवाद :) –

+8

स्ट्रोकलेयर लेबल को कवर करता है इसलिए मैंने इसे 'shape.fillColor = [UIColor clearcolor] को ठीक करने के लिए जोड़ा। .CGColor' –

0

यदि आप CALayer उपclass करते हैं, तो आप इसे मास्क के साथ तुरंत चालू कर सकते हैं, और उस मास्क पर इच्छित सीमा को शामिल करने के लिए layoutSubLayers को ओवरराइड भी कर सकते हैं।

यह कुछ तरीकों से कर सकता है। नीचे दिए गए मास्क के path का उपयोग करके और layoutSubLayers में नई सीमा बनाने के लिए कक्षा संपत्ति को निर्दिष्ट करने के लिए इसे बीमार करें। ऐसी संभावना है कि इस विधि को कई बार बुलाया जा सके, इसलिए मैंने इसे ट्रैक करने के लिए एक बूलियन भी सेट किया। (यह भी एक वर्ग संपत्ति के रूप में सीमा आवंटित कर सकते हैं, और हटाने/फिर से जोड़ना हर बार अभी के लिए, मैं bool जांच का उपयोग

स्विफ्ट 3:।।

class CustomLayer: CALayer { 

    private var path: CGPath? 
    private var borderSet: Bool = false 

    init(maskLayer: CAShapeLayer) { 
     super.init() 
     self.path = maskLayer.path 
     self.frame = maskLayer.frame 
     self.bounds = maskLayer.bounds 
     self.mask = maskLayer 
    } 

    override func layoutSublayers() { 

     let newBorder = CAShapeLayer() 

     newBorder.lineWidth = 12 
     newBorder.path = self.path 
     newBorder.strokeColor = UIColor.black.cgColor 
     newBorder.fillColor = nil 


     if(!borderSet) { 
      self.addSublayer(newBorder) 
      self.borderSet = true 
     } 

    } 

    required override init(layer: Any) { 
     super.init(layer: layer) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
संबंधित मुद्दे