2011-10-24 19 views
6

कहता है कि अगर मैं view.bounds.origin (50,50) पर सेट करता हूं, तो सबव्यू खींचा जाता है (50,50) देखने के लिए छोड़ दिया जाता है। लेकिन मैंने सोचा कि यह उलटा परिणाम होना चाहिए, तो बाध्यता क्या है।view.bounds.origin का अर्थ क्या है?

खेद दोस्तों, मैं एक देशी अंग्रेजी वक्ता नहीं हूँ, इसलिए मैं इस नमूना कोड और छवि इस समय ~~

subview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; 
subview.backgroundColor = [UIColor blueColor]; 
subview.bounds = CGRectMake(50, 50, 200, 200); 

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)]; 
subsubview.backgroundColor = [UIColor yellowColor]; 
[subview addSubView:subsubView]; 

इस इस परिणाम का कारण होगा डाल: enter image description here

तो क्यों

पीला दृश्य वहां स्थित है?

+0

"उलटा परिणाम" से आपका क्या मतलब है? – Geoffroy

+0

क्या आप संभवतः कुछ उदाहरण कोड के साथ स्पष्टीकरण दे सकते हैं, जो देखते हैं कि आप बाउंड्स को व्यवस्थित कर रहे हैं और जब आप सबव्यूव जोड़ रहे हैं, और सबव्यू का फ्रेम क्या है? – jrturton

+0

जहां आपने bounds.origin सेट किया है? –

उत्तर

4

documentation से:

स्क्रीन पर, सीमा आयत इसके फ्रेम आयत के रूप में देखने का एक ही दिखाई भाग का प्रतिनिधित्व करता है। डिफ़ॉल्ट रूप से, सीमा आयत के मूल (0, 0) के लिए निर्धारित है, लेकिन आप को देखने के प्रदर्शन विभिन्न भागों को यह मूल्य बदल सकते हैं।

आप bounds बदलकर क्या किया है अनुवाद करने के लिए subView के आंतरिक नीचे और सही करने के लिए 50 अंक से अंतरिक्ष समन्वय प्रभावी रूप से है। इसके बाद आप 0,0 subView भीतर के का एक मूल के साथ 'subsubView' को शामिल किया अंतरिक्ष समन्वय - यह इसलिए है 50 अंक ऊपर और subView के दृश्य मूल के बाईं ओर।

आप निर्धारित किया था, तो subView के framebounds के बजाय, आप subView ले जाया गया है | यह superview के समन्वय जगह है भीतर है, तो आपके नीले वर्ग ऊपर ले जाया गया है | और बाएँ, और पीले वर्ग के भीतर समाहित किया जाएगा यह और एक ही उत्पत्ति है।

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

तो, एक subview के frame superview के bounds में उसके स्थान और आकार का वर्णन है। superview के bounds एक गैर शून्य मूल है, और आप एक frame साथ एक subview एक शून्य मूल होने जोड़ेंगे, तो वह "बाहर" superview की सीमा होने जा रहा है।

+0

"इसलिए यह उप-दृश्य की दृश्य उत्पत्ति के 50 अंक ऊपर और बाईं ओर है" क्यों है, क्या आप इसे थोड़ा और समझा सकते हैं? – onmyway133

+0

@entropy - संपादित। उम्मीद है की वो मदद करदे। – jrturton

+0

1. "f आपने सीमाओं के बजाय सबव्यू के फ्रेम को सेट किया था, तो आप इसके पर्यवेक्षण के समन्वय स्थान के भीतर सबव्यू को स्थानांतरित कर देते थे, इसलिए आपका नीला वर्ग ऊपर और बाईं ओर ले जाया गया था" मुझे लगता है कि आपने यहां सबव्यू के फ्रेम को बदल दिया है (सबव्यू। frame.origin.x + = 50, subView.frame.origin.y + = 50) नीचे दाईं ओर ले जाना चाहिए। इसके अलावा, मैं छवियों को चित्रित नहीं कर सकता कि इसकी उत्पत्ति – onmyway133

1

आपका नीला दृश्य का फ्रेम अभी भी 100, 100, 200, 200 है। सीमाएं 50, 50, 200, 200 हैं, लेकिन फ्रेम अपरिवर्तित है।

पीला दृश्य नीले दृश्य में जोड़ा गया है, 0, 0 पर, सीमाओं के भीतर, फ्रेम नहीं। तो पीला 50, 50, 50, 50 पर दिखा रहा है।

बदलें:

subview.bounds = CGRectMake(50, 50, 200, 200);

करने के लिए:

subview.bounds = CGRectMake(100, 100, 200, 200);

और देखो क्या होता।

+0

सीमाएं क्या दिखती हैं जब इसकी सीमा मूल बदल जाती है? मैं कल्पना नहीं कर सकता – onmyway133

0

स्क्रीन पर, सीमा आयत इसके फ्रेम आयत के रूप में देखने का एक ही दिखाई भाग का प्रतिनिधित्व करता है। डिफ़ॉल्ट रूप से, सीमा आयत के मूल (0, 0) के लिए निर्धारित है, लेकिन आप को देखने के प्रदर्शन विभिन्न भागों को यह मूल्य बदल सकते हैं। सीमा आयत का आकार फ्रेम आयताकार के आकार के साथ जोड़ा गया है, ताकि एक में परिवर्तन दूसरे को प्रभावित कर सकें। सीमा का आकार बदलना या इसके केंद्र बिंदु से संबंधित दृश्य को कम करता है। सीमा आयताकार के निर्देशांक हमेशा अंक में निर्दिष्ट होते हैं।

UIView's documentation से।

View Programming guide का अध्ययन भी सहायक होगा।

2

समस्या है हम आम तौर पर लगता है कि जब blue view सीमा मूल (सही नीचे करने के लिए उदाहरण के बदलाव के लिए) तो पीला दृश्य चाहिए नीचे भी बदलाव ठीक है, बदल रहा है, yellow view स्थिति के रूप में अपनी प्रणाली superview समन्वय के सापेक्ष है (इस में मामले blue view सीमा मूल)। यह मामला

इसके बजाय, हमें यह सोचना चाहिए कि blue view एक मुखौटा परिभाषित करता है जिसमें यह केवल अपने समन्वय स्थान में आयताकार का एक हिस्सा दिखाता है। इसलिए यदि हम blue view सीमाओं को दाहिने तल पर बदलते हैं, तो यह सिर्फ मास्क को दाहिने तल पर बदल देता है, और केवल उस मुखौटा के अंदर के दृश्य दिखाए जाते हैं। और red view पर, यह हमेशा दिखाता है कि एक निश्चित स्थिति पर मुखौटा (blue view फ्रेम मूल नहीं बदलता है)। blue view मुखौटा लेने और स्थिति blue view फ्रेम

बस ओले द्वारा इस Understanding UIScrollView पाया जो बहुत उपयोगी है द्वारा परिभाषित पर डाल red view के बारे में सोचो और यह बहुत स्पष्ट रूप से बताते हैं

मैं दृढ़ता से पढ़ने की सलाह देते इस

एक दृश्य व्यूपोर्ट को इसके समन्वय सिस्टम द्वारा परिभाषित विमान में प्रदान करता है। दृश्य की सीमा आयत दृश्य क्षेत्र का की स्थिति और आकार का वर्णन करती है।

ऐसा लगता है कि दृश्य 100 अंक से नीचे चला गया है, और यह वास्तव में अपने समन्वय प्रणाली के संबंध में सच है।view's स्क्रीन पर वास्तविक स्थिति (या इसके superview में, यह अधिक डाल करने के लिए सही ढंग से) स्थिर बना रहे, तथापि, कि के रूप में अपनी फ्रेम, जो नहीं बदला है से निर्धारित होता है

enter image description here

0

UIWindow: फ्रेम == सीमाएं :: ==> (0, 0, विंडोविड्थ, विंडोहेइट)

सबव्यू: फ्रेम :: ==> (100, 100, 200, 200) UIWindows सीमाओं पर [UIWindows कॉर्डिनेट स्पेस।]

जब यो यू ऐसा करते हैं:

subview.bounds = CGRectMake(50, 50, 200, 200); 

आप कह रहे हैं कि subview के subview फ्रेम (50,50, 200, 200) के साथ शुरू होगा अगर वह subview के subview [subsubview] subview ठीक से कवर करने के लिए थे।

जैसे ही आपको अपने सबव्यू के फ्रेम को अपने सबव्यू के साथ विंडो को कवर करने के लिए (0,0, विंडोविड्थ, विंडोहेइट) को निर्दिष्ट करने की आवश्यकता होगी।

बिंदु यह है कि, एक SUBVIEWS फ्रेम अपने तत्काल सुपरव्यूस कॉर्डिनेट सिस्टम पर निर्भर है। तत्काल पर्यवेक्षण की स्थानीय/आंतरिक समन्वय प्रणाली इसकी सीमा है।

इस बिंदु पर आ रहा है कि सबब्यूव्यूव 50 50 अंक तक क्यों है और छोड़ दिया गया है।

subview.bounds = CGRectMake(50, 50, 200, 200); 

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)]; 

(0,0) और (50,50) के बीच तुलना करें।
हमने कहा कि सबव्यू की स्थानीय/आंतरिक कॉर्डिनेट स्पेस (50,50, 200, 200) हमने फिर दृश्य सबव्यू के अंदर सबव्यूव का सबव्यू [सबब्यूव्यू] जोड़ा (0,0) जोड़ा जो 50 (50)।

इस मामले में, (0,0) (50,50) का शीर्ष बायां है। यही कारण है कि यह हुआ।

यदि आपको अभी भी इसका अर्थ नहीं मिलता है, तो फिर गहरा नज़र डालें और धीरे-धीरे नोटबुक में कुछ आयताकार बनाएं। इसे सही हाथ पाने के लिए मुश्किल है।

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