मेरे पास एक दृश्य है जिस पर कुछ CAShapeLayer हैं। मैं इसे निम्नानुसार आलसी रूप से तत्काल कर रहा हूं:

lazy var myViewWithLayersOnIt: UIView = {
    let view = UIView(frame: CGRect(origin: CGPoint(x: 14,
                                                    y: 2),
                                    size: CGSize(width: 10,
                                                 height: 10)))
    view.translatesAutoresizingMaskIntoConstraints = false

    let outerCircleLayer = CAShapeLayer()
    let outerPath = UIBezierPath(ovalIn: view.frame).cgPath
    outerCircleLayer.path = outerPath
    outerCircleLayer.position = view.center
    outerCircleLayer.fillColor = UIColor.white.cgColor
    view.layer.addSublayer(outerCircleLayer)

    let innerFrame = CGRect(origin: CGPoint(x: 1.5,
                                            y: 1.5),
                            size: CGSize(width: 8.5,
                                         height: 8.5))
    let innerCircleLayer = CAShapeLayer()
    let innerPath = UIBezierPath(ovalIn: innerFrame).cgPath
    innerCircleLayer.path = innerPath
    innerCircleLayer.position = view.center
    innerCircleLayer.fillColor = UIColor.red.cgColor
    view.layer.addSublayer(innerCircleLayer)

    return view
}()

जबकि स्क्रीन पर प्रस्तुत की जाने वाली हर चीज़ रेंडर कर रही है, CAShapeLayers view के केंद्र में नहीं जा रहे हैं। मैंने सोचा कि यह आलसी तत्काल करने के कारण हो सकता है, इसलिए मैंने आलसी छोड़ दिया और मुझे वही समस्या दिखाई दे रही है। मैं क्या करना भूल गया?

इस प्रकार यह प्रतिपादन कर रहा है:

enter image description here

पढ़ने के लिए धन्यवाद। मैं आपके इनपुट का स्वागत करता हूं।

0
Adrian 21 अक्टूबर 2020, 00:32

1 उत्तर

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

आपको outerPath के लिए view.frame के बजाय view.bounds का उपयोग करना चाहिए। outerCircleLayer का position सेट करने की आवश्यकता नहीं है, न ही innerCircleLayer

lazy var myViewWithLayersOnIt: UIView = {
    let view = UIView(frame: CGRect(origin: CGPoint(x: 14,
                                                        y: 2),
                                        size: CGSize(width: 10,
                                                     height: 10)))
        

    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.black

    let outerCircleLayer = CAShapeLayer()
    let outerPath = UIBezierPath(ovalIn: view.bounds).cgPath /// bounds!
    outerCircleLayer.path = outerPath
//    outerCircleLayer.position = view.center
    outerCircleLayer.fillColor = UIColor.white.cgColor
    view.layer.addSublayer(outerCircleLayer)

    let innerFrame = CGRect(origin: CGPoint(x: 1.5,
                                                y: 1.5),
                                size: CGSize(width: 8.5,
                                             height: 8.5))
    let innerCircleLayer = CAShapeLayer()
    let innerPath = UIBezierPath(ovalIn: innerFrame).cgPath
    innerCircleLayer.path = innerPath
//    innerCircleLayer.position = view.center
    innerCircleLayer.fillColor = UIColor.red.cgColor
    view.layer.addSublayer(innerCircleLayer)

    return view
}()

नतीजा:

circles centered inside each other

लाल वृत्त केंद्र से बाहर है क्योंकि

let innerFrame = CGRect(origin: CGPoint(x: 1.5,
                                        y: 1.5),
                        size: CGSize(width: 8.5,
                                     height: 8.5))

होना चाहिए

let innerFrame = CGRect(origin: CGPoint(x: 0.75,
                                        y: 0.75),
                        size: CGSize(width: 8.5,
                                     height: 8.5))

८.५ + ०.७५ + ०.७५ = १०, न कि ८.५ + १.५ + १.५ = ११.५

red circle's center fixed

1
aheze 21 अक्टूबर 2020, 01:44