2009-07-01 11 views
191

UIView गुण frame, bounds, center, और origin है, और वे सभी एक दूसरे से जुड़े हुए प्रतीत होते हैं। अधिकांश समय, frame से UIView की स्थिति और आकार सेट करते समय मैं सौदा करता हूं। मैं समझता हूं कि frame वैश्विक समन्वय प्रणाली का उपयोग कर रहा है और bounds स्थानीय दृश्य के समन्वय का उपयोग कर रहा है (इसलिए इसका एक्स और वाई 0 है, लेकिन हमेशा नहीं), लेकिन यह अभी भी मुझे उपयोग करने के लिए भ्रमित कर रहा है।UIView का फ्रेम, सीमाएं, केंद्र, मूल, कब उपयोग करें?

अन्य संदर्भों (bounds, center, origin) के तहत किस संदर्भ (और सही समय क्या है) के तहत उपयोग किया जाना चाहिए?

+0

लिंक नीचे सबसे अच्छा उत्तर नहीं है। http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center – Ohmy

+0

चित्रों के साथ फ़्रेम बनाम बाउंड: http://stackoverflow.com/a/28917673/3681880 – Suragch

उत्तर

235

मार्को के जवाब ऊपर सही है, लेकिन सिर्फ "किस संदर्भ के तहत" के सवाल पर विस्तार करने के लिए ...

फ्रेम - इस संपत्ति सामान्य iPhone अनुप्रयोगों के लिए आप अक्सर उपयोग है। अधिकांश नियंत्रण "युक्त" नियंत्रण के सापेक्ष रखे जाएंगे, इसलिए frame.origin सीधे उस नियंत्रण के अनुरूप होगा जहां नियंत्रण को प्रदर्शित करने की आवश्यकता है, और frame.size निर्धारित करेगा कि नियंत्रण कितना बड़ा है।

केंद्र - यह वह संपत्ति है जिस पर आप स्प्राइट आधारित गेम और एनिमेशन के लिए ध्यान केंद्रित करेंगे जहां आंदोलन या स्केलिंग हो सकती है। डिफ़ॉल्ट रूप से एनीमेशन और रोटेशन UIView के केंद्र पर आधारित होगा। फ्रेम संपत्ति द्वारा ऐसी वस्तुओं को आजमाने और प्रबंधित करने के लिए शायद ही कभी समझदारी होती है।

सीमा - यह संपत्ति एक स्थिति निर्धारण संपत्ति नहीं है, लेकिन फ्रेम के लिए UIView "रिश्तेदार" के खींचने योग्य क्षेत्र को परिभाषित करती है। डिफ़ॉल्ट रूप से यह संपत्ति आमतौर पर (0, 0, चौड़ाई, ऊंचाई) है। इस संपत्ति को बदलने से आप फ्रेम के बाहर खींच सकते हैं या फ्रेम के भीतर एक छोटे से क्षेत्र में ड्राइंग को प्रतिबंधित कर सकते हैं। इसकी एक अच्छी चर्चा नीचे दिए गए लिंक पर मिल सकती है। ड्राइंग क्षेत्र को समायोजित करने की विशिष्ट आवश्यकता होने तक इस संपत्ति को छेड़छाड़ करने के लिए असामान्य है। एकमात्र अपवाद यह है कि अधिकांश कार्यक्रम अनुप्रयोग के दृश्य क्षेत्र को निर्धारित करने के लिए स्टार्टअप पर [[UIScreen mainScreen] bounds] का उपयोग करेंगे और तदनुसार उनके प्रारंभिक UIView के फ्रेम को सेट करेंगे।

Why is there an frame rectangle and an bounds rectangle in an UIView?

उम्मीद है कि इस हालात जहां प्रत्येक संपत्ति आदत हो सकता है स्पष्ट में मदद करता है।

+31

मुझे लगता है कि यह जोड़ने योग्य है कि 'सीमाएं' आमतौर पर तब उपयोग की जाती हैं जब दृश्य में एक परिवर्तन होता है। इन परिस्थितियों में 'फ्रेम' संपत्ति अनिर्धारित है। जैसा कि अन्य उत्तरों द्वारा इंगित किया गया है, 'केंद्र' और 'सीमाएं' को संशोधित करना क्रमशः दृश्य की स्थिति और आकार को संशोधित करने के बराबर है। – Stuart

17

गुण center, bounds और frame इंटरलाक्ड हैं: एक बदलना दूसरों को अपडेट करेगा, इसलिए आप उनका उपयोग करें। उदाहरण के लिए, हाल ही में एक दृश्य के लिए frame के x/y पैरा को संशोधित करने के बजाय, बस center संपत्ति अपडेट करें।

35

वे संबंधित मान हैं, और संपत्ति सेटटर/गेटर विधियों द्वारा संगत रखा गया है (और इस तथ्य का उपयोग करते हुए कि फ्रेम एक पूर्ण रूप से संश्लेषित मूल्य है, वास्तविक आवृत्ति चर द्वारा समर्थित नहीं है)।

मुख्य समीकरणों हैं:

frame.origin = center - bounds.size/2 

(जो रूप में ही है)

center = frame.origin + bounds.size/2 

(और वहाँ भी है)

frame.size = bounds.size 

है कोड, बस व्यक्त करने के लिए समीकरण नहीं है कि तीन गुणों के बीच invariant। ये समीकरण यह भी मानते हैं कि आपके व्यू का रूपांतरण पहचान है, जो डिफ़ॉल्ट रूप से है। यदि यह नहीं है, तो सीमाएं और केंद्र समान अर्थ रखते हैं, लेकिन फ्रेम बदल सकता है। जब तक आप गैर-दाएं-कोण रोटेशन नहीं कर रहे हैं, तब तक पर्यवेक्षण के निर्देशांक के संदर्भ में फ्रेम हमेशा परिवर्तित दृश्य होगा।

यह सामान सब एक उपयोगी मिनी पुस्तकालय यहाँ के साथ और अधिक विस्तार से समझाया गया है:

http://bynomial.com/blog/?p=24

संबंधित मुद्दे