मैंने बटन बॉर्डर बनाने के लिए कोड का इस्तेमाल किया।

मुझे किसी कारण से बटन बॉर्डर का आकार बदलना है।

हालांकि, मुखौटा द्वारा उत्पन्न सीमा को निम्न कोड के साथ प्रारंभ नहीं किया गया है।

button.backgroundColor = .clear
button.layer.CornerRadius = 0

ViewController.swift में:

@IBOutlet weak var btnDelete: UIButton!

func FirstChange() {
    btnDelete.layer.borderWidth = 0
    btnDelete.layer.cornerRadius = 0
    btnDelete.layer.borderColor = UIColor(rgb: 0xFFFFFF).cgColor
    // Draw the border again
    btnDelete.round(corners: [.topRight, .bottomRight], radius: 50, borderColor: UIColor(rgb: 0xced4da), borderWidth: 1)
}

func SecChange() {
    btnDelete.backgroundColor = .clear // not work
    // Draw the border again
    btnDelete.layer.borderColor = UIColor(rgb: 0xced4da).cgColor
    btnDelete.layer.borderWidth = 1
    btnDelete.layer.cornerRadius = 18
}

UIView.swift में:

func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
    let mask = _round(corners: corners, radius: radius)
    addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)
}

@discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer {
    let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
    return mask
}

func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) {
    let borderLayer = CAShapeLayer()
    borderLayer.path = mask.path
    borderLayer.fillColor = UIColor.clear.cgColor
    borderLayer.strokeColor = borderColor.cgColor
    borderLayer.lineWidth = borderWidth
    borderLayer.frame = bounds
    layer.addSublayer(borderLayer)
}

दूसरी बार बॉर्डर ड्रा करें (रन SecChange()), यह पहली बॉर्डर के साथ ओवरलैप करता है।

मेरे द्वारा पेंट की गई पहली बॉर्डर को इनिशियलाइज़ करने में कृपया मेरी मदद करें।

(SecChange() को चलाना और FirstChange() को चलाना सफलतापूर्वक बॉर्डर को इनिशियलाइज़ करता है।)

0
Enkha 26 फरवरी 2019, 11:54

1 उत्तर

सबसे बढ़िया उत्तर

चूँकि आप CAShapeLayer को UIButton में जोड़ रहे हैं, इसलिए आपको बटन से इस परत को हटाना होगा। इसके लिए आप परत को एक name दे सकते हैं और परत को हटाने के लिए एक नई विधि जोड़ें और अपने दूसरे परिवर्तन में उस नई विधि को कॉल करें। इसके अतिरिक्त आपको round(corners:radius:borderColor:borderWidth:) को दोबारा कॉल करते समय सीमा परत को हटा देना चाहिए, अन्यथा आप शीर्ष पर एक और परत के साथ समाप्त हो जाएंगे।

func SecChange() {
        btnDelete.removeBorderLayer() //remove border layer if existing
        // Draw the border again
        btnDelete.layer.borderColor = UIColor.gray.cgColor
        btnDelete.layer.borderWidth = 1
        btnDelete.layer.cornerRadius = 18
    }
extension UIView {
    func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
        let mask = _round(corners: corners, radius: radius)
        addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)
    }

    @discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
        return mask
    }

    func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) {
        removeBorderLayer()
        let borderLayer = CAShapeLayer()
        borderLayer.name = "borderLayer"
        borderLayer.path = mask.path
        borderLayer.fillColor = UIColor.clear.cgColor
        borderLayer.strokeColor = borderColor.cgColor
        borderLayer.lineWidth = borderWidth
        borderLayer.frame = bounds
        layer.addSublayer(borderLayer)
    }

    func removeBorderLayer() {
        if let borderLayer = layer.sublayers?.first(where: { $0.name == "borderLayer" }) {
            borderLayer.removeFromSuperlayer()
        }
    }
}

बेस्ट, कार्स्टन

1
carsten 26 फरवरी 2019, 10:33