UIView के फ्रेम, सीमा, केंद्र, उत्पत्ति, कब क्या उपयोग करना है?


195

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

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


नीचे दिए गए लिंक में सबसे अच्छा जवाब है। stackoverflow.com/questions/5361369/…
ओमी

तस्वीरों के साथ फ्रेम बनाम सीमा: stackoverflow.com/a/28917673/3681880
सर्ग

जवाबों:


241

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

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

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

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

UIView में फ्रेम आयत और सीमा आयत क्यों है?

उम्मीद है कि यह उन परिस्थितियों को स्पष्ट करने में मदद करता है जहां प्रत्येक संपत्ति का उपयोग किया जा सकता है।


33
मुझे लगता है कि यह जोड़ने योग्य है कि boundsआमतौर पर इसका उपयोग तब किया जाता है जब कोई दृश्य इसके लिए लागू होता है। इन परिस्थितियों में frameसंपत्ति अपरिभाषित है। के रूप में, अन्य उत्तर से बताया संशोधित करने centerऔर boundsक्रमशः दृश्य की स्थिति और आकार को संशोधित करने के बराबर हैं।
स्टुअर्ट

36

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

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

frame.origin = center - bounds.size / 2

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

center = frame.origin + bounds.size / 2

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

frame.size = bounds.size

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

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

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


18

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

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