iPhone - पूरे UIWindow के भीतर UIView की स्थिति प्राप्त करें


206

एक की स्थिति UIViewस्पष्ट रूप से view.centerया view.frameआदि द्वारा निर्धारित की जा सकती है, लेकिन यह केवल UIViewइसके तत्काल पर्यवेक्षण के संबंध में स्थिति देता है ।

मुझे UIViewपूरे 320x480 समन्वय प्रणाली में स्थिति की स्थिति निर्धारित करने की आवश्यकता है। उदाहरण के लिए, यदि यह विंडो के भीतर स्थिति UIViewमें है , तो UITableViewCellपर्यवेक्षक की नाटकीय रूप से अनियमितता को बदल सकता है।

किसी भी विचार अगर और यह कैसे संभव है?

चियर्स :)

जवाबों:


339

यह एक आसान है:

[aView convertPoint:localPosition toView:nil];

... विंडो निर्देशांक के लिए स्थानीय समन्वय अंतरिक्ष में एक बिंदु धर्मान्तरित। आप इस पद्धति का उपयोग इस तरह से विंडो स्पेस में किसी दृश्य की उत्पत्ति की गणना करने के लिए कर सकते हैं:

[aView.superview convertPoint:aView.frame.origin toView:nil];

2014 संपादित करें: Matt__C की टिप्पणी की लोकप्रियता को देखते हुए यह कहना उचित लगता है कि निर्देशांक ...

  1. डिवाइस को घुमाते समय न बदलें।
  2. हमेशा असंबद्ध स्क्रीन के ऊपरी बाएं कोने में उनकी उत्पत्ति होती है।
  3. कर रहे हैं खिड़की निर्देशांक : समन्वय प्रणाली IST खिड़की की सीमा के द्वारा परिभाषित किया गया। स्क्रीन और डिवाइस समन्वय प्रणाली अलग हैं और विंडो निर्देशांक के साथ मिश्रित नहीं होना चाहिए।

भयानक :) मुझे लगा कि यह सरल होना चाहिए, लेकिन मुझे लग रहा था कि सेब इसे इतना आसान नहीं देगा ... अच्छी तरह से उन्होंने किया। धन्यवाद
लाइर फ्रेनकेल

41
ध्यान रखें कि inView पैरामीटर में शून्य निर्दिष्ट करना आपको डिवाइस को-ऑर्डिनेट करता है, जो कि आप पोर्ट्रेट ओरिएंटेशन में नहीं चाहते हैं। देखें convertpointtoview-इन-परिदृश्य मोड दे-गलत मूल्यों
Matt__C

2
यह विधि aView.frame.originमेरे लिए लौटती रही । यह मेरे विचार के पर्यवेक्षण को महसूस करने के लिए मुझे पूरी तरह से एक पर्यवेक्षणीय नहीं बना था।
दान अब्रामोव 19

3
यदि आपके सुपर व्यू में सुपरव्यू नहीं था, तो आपका दृश्य बिल्कुल भी नहीं देखा जाना चाहिए
user4951

17
@Matt__C को आपके मामले से जुड़े समाधान के साथ जोड़ना, यह बन जाएगा:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
घिघो


33

विस्तार के साथ स्विफ्ट 3:

extension UIView{
    var globalPoint :CGPoint? {
        return self.superview?.convert(self.frame.origin, to: nil)
    }

    var globalFrame :CGRect? {
        return self.superview?.convert(self.frame, to: nil)
    }
}


9

यहां @Mohsenasm द्वारा उत्तर का संयोजन है और @Chigo की एक टिप्पणी स्विफ्ट को अपनाया गया है

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}

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