इसके पर्यवेक्षण के पर्यवेक्षण के संबंध में UIView की स्थिति प्राप्त करें


97

मेरे पास एक UIView है, जिसमें मैंने UIButtons की व्यवस्था की है। मैं उन UIButtons के पदों को खोजना चाहता हूं।

मैं जानता हूं कि buttons.frameमुझे पद दिए जाएंगे, लेकिन यह मुझे इसके तत्काल पर्यवेक्षण के संबंध में ही पद देगा।

क्या कोई तरीका है जिससे हम उन बटनों की स्थिति का पता लगा सकते हैं, जो यूआईबटन के पर्यवेक्षक के पर्यवेक्षण के लिए सम्मान है?

उदाहरण के लिए, मान लीजिए कि UIView का नाम "firstView" है।

फिर, मेरे पास एक और UIView है, "दूसरा दृश्य"। यह "दूसरा दृश्य" "FirstView" का एक उप-भाग है।

फिर मेरे पास "सेकंड व्यू" पर एक सबव्यू के रूप में यूबूटन है।

->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button

अब, क्या कोई तरीका है कि हम "पहले दृश्य" के संबंध में उस यूबूटन की स्थिति का पता लगा सकें?

जवाबों:


192

आप इसका उपयोग कर सकते हैं:

उद्देश्य सी

CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];

तीव्र

let frame = firstView.convert(buttons.frame, from:secondView)

दस्तावेज़ीकरण संदर्भ:

https://developer.apple.com/documentation/uikit/uiview/1622498-convert


इसे जोड़ने के लिए, यदि आपका दृश्य हमेशा एक ही दृश्य में नहीं है (जैसे कि, यदि आप इसे किसी फ़ंक्शन में उपयोग कर रहे हैं) तो आप 'डाल सकते हैं ...' से: दृश्य: [बटन पर्यवेक्षण]]; '
मायलोगन

39

हालाँकि पदानुक्रम में बटन के लिए विशिष्ट नहीं है क्योंकि मैंने पूछा कि यह कल्पना करना और समझना आसान है:

यहां से: मूल स्रोत

यहां छवि विवरण दर्ज करें

ObjC:

CGPoint point = [subview1 convertPoint:subview2.frame.origin toView:viewController.view];

स्विफ्ट:

let point = subview1.convert(subview2.frame.origin, to: viewControll.view)

20

स्विफ्ट 3 के लिए अपडेट किया गया

    if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {

        print(frame)
    }

यहां छवि विवरण दर्ज करें


7

फ्रेम: (एक्स, वाई, चौड़ाई, ऊंचाई)।

इसलिए चौड़ाई और ऊंचाई में परिवर्तन भी सुपर-सुपर दृश्य नहीं दिखाते। आप आसानी से निम्नलिखित के रूप में एक्स, वाई प्राप्त कर सकते हैं।

X = button.frame.origin.x + [button superview].frame.origin.x;
Y = button.frame.origin.y + [button superview].frame.origin.y;

लेकिन मुझे एक्स, वाई मूल्य इतनी अधिक मात्रा में क्यों मिल रहा है, जैसे कि जब मेरा एक्स 0,0 था, तब मैं आपके कोड की पंक्तियों के साथ मिल रहा था; 180224 या तो?

5

यदि ढेर सारे विचार हैं, और जिन विचारों में आपकी रुचि है, उनके बीच किसी भी संभावित विचार को जानने के लिए आपको (या चाहते हैं) ज़रूरत नहीं है, तो आप यह कर सकते हैं:

static func getConvertedPoint(_ targetView: UIView, baseView: UIView)->CGPoint{
    var pnt = targetView.frame.origin
    if nil == targetView.superview{
        return pnt
    }
    var superView = targetView.superview
    while superView != baseView{
        pnt = superView!.convert(pnt, to: superView!.superview)
        if nil == superView!.superview{
            break
        }else{
            superView = superView!.superview
        }
    }
    return superView!.convert(pnt, to: baseView)
}

जहां targetViewबटन baseViewहोगा , वहीं होगा ViewController.view
यह फ़ंक्शन जो करने की कोशिश कर रहा है वह निम्न है:
यदि targetViewकोई सुपर दृश्य नहीं है, तो यह वर्तमान समन्वय है।
यदि targetView'sसुपर दृश्य बेस व्यू नहीं है (यानी बटन के बीच अन्य विचार हैं viewcontroller.view) और , एक समन्वित समन्वय को पुनः प्राप्त किया जाता है और अगले में पास किया जाता है superview
यह बेस व्यू की ओर बढ़ते हुए विचारों के ढेर के माध्यम से ऐसा ही करता रहता है।
एक बार जब यह पहुंच जाता है baseView, तो यह एक अंतिम रूपांतरण करता है और इसे वापस करता है।
नोट: यह ऐसी स्थिति को संभालता नहीं है जहाँ targetViewपर स्थित है baseView


4

सबवे के फ्रेम (@Rexb उत्तर से प्रेरित) को परिवर्तित करने के लिए UIView एक्सटेंशन।

extension UIView {

    // there can be other views between `subview` and `self`
    func getConvertedFrame(fromSubview subview: UIView) -> CGRect? {
        // check if `subview` is a subview of self
        guard subview.isDescendant(of: self) else {
            return nil
        }

        var frame = subview.frame
        if subview.superview == nil {
            return frame
        }

        var superview = subview.superview
        while superview != self {
            frame = superview!.convert(frame, to: superview!.superview)
            if superview!.superview == nil {
                break
            } else {
                superview = superview!.superview
            }
        }

        return superview!.convert(frame, to: self)
    }

}

// usage:
let frame = firstView.getConvertedFrame(fromSubview: buttons.frame)

2

आप आसानी से निम्नलिखित के रूप में सुपर-सुपर दृश्य प्राप्त कर सकते हैं।

दूसरा दृश्य -> ​​[बटन
पर्यवेक्षण ] firstView -> [[बटन पर्यवेक्षण ] पर्यवेक्षण]

फिर, आप बटन की स्थिति प्राप्त कर सकते हैं।

आप इसका उपयोग कर सकते हैं:

xPosition = [[button superview] superview].frame.origin.x;
yPosition = [[button superview] superview].frame.origin.y;

2
कुछ स्पष्टीकरण जोड़ने से यह उत्तर अधिक उपयोगी होगा।
सागर ज़ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.