2011-12-09 15 views
29

जब UIView का bounds.origin(0, 0) नहीं होगा?जब UIView की bounds.origin नहीं होगी (0, 0)?

This post मेरे लिए मददगार था:

महत्वपूर्ण !! बाउंड एक्स और वाई, मूल, व्यू के अंदर जाने के लिए हैं। एक्स +5 के लिए, फ्रेम की उत्पत्ति के बाईं ओर 5pix को ले जाने के लिए अर्थ है इस दृश्य के भीतर सभी सामग्री को फ्रेम के मूल के बाईं ओर 5pix पर खींचें। यह अपने आप से कुछ भी नहीं करता है, यह पर प्रभावित हो रहा है जो प्रभावित हो जाता है।

लेकिन यह केवल उस मामले का वर्णन करता है जब मैंने bounds.origin का मूल्य निर्धारित किया था।
अन्य मामलों में bounds.origin != (0, 0) का मूल्य?

+1

गूगल कुछ अस्पष्टीकृत कारण के लिए है कि पोस्ट को छिपा दिया है - हम अब (मैं, एक लॉगिन पृष्ठ पर ले जाया हो Google.com से एक मजबूर रीडायरेक्ट) – Adam

उत्तर

0

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

अधिक विस्तृत रूप से इस सवाल का जवाब ज्यादातर मामलों यह नहीं होगा में तैनात करने के लिए चला जाता है के लिए। यदि आप अपने दृश्य को नकारात्मक चौड़ाई और/या ऊंचाई के साथ प्रारंभ करते हैं, तो आपको ऊंचाई के चौड़ाई और/या नकारात्मक वाई के नकारात्मक एक्स के साथ उत्पत्ति मिल जाएगी।

+2

मुझे नहीं लगता कि यह सच है कि यह उपयोग करने की अनुमति कर रहे हैं । मैंने ऐसे मामलों को देखा है जहां ऑटोरेसाइजिंग से संबंधित सिस्टम में कुछ मुझे सीमाओं के साथ छोड़ देता है जहां उत्पत्ति 0.0 नहीं थी। अपने स्वयं के कोड में मैंने कभी भी सीमा तय नहीं की है, इसलिए अचानक यह एक गैर-शून्य संख्या मौजूद है, यह एक सदमा था। –

+0

@ केंडलहेल्मस्टेटर गेलनर सहमत हुए। यह मेरे साथ हुआ जब मेरे पास एक नेविगेशन नियंत्रक था जो मेरे UIScrollView के कुछ आकार बदल रहा था (मुझे लगता है कि "स्क्रॉल व्यू इन्सेट समायोजित करें" सेटिंग के परिणामस्वरूप)। – eremzeit

15

यदि आप नकारात्मक चौड़ाई/ऊंचाई के साथ दृश्य प्रारंभ करते हैं तो bounds.origin नकारात्मक होगा। उदाहरण के लिए, यदि आप

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)]; 

किया फ्रेम होगा:

origin = { 
    x = -5, 
    y = -15 
}, 
size = { 
    width = 10, 
    height = 20 
} 

सीमा:

origin = { 
    x = -10, 
    y = -20 
}, 
size = { 
    width = 10, 
    height = 20 
} 

केंद्र:

x = 0, 
y = -5 

खुद आजमाएँ!

+0

इसका कोई मतलब नहीं है। यह अभिव्यक्ति के बराबर है "समन्वय प्रणाली की उत्पत्ति खुद के सापेक्ष <0,0> के बराबर नहीं है" जो गलत है और इसका कोई मतलब नहीं है। – folex

+1

आप कभी भी नकारात्मक चौड़ाई और ऊंचाई क्यों बनाना चाहते हैं? – Boon

+2

समझना या नहीं, यदि आप इस कोड को निष्पादित करते हैं तो वे परिणाम प्राप्त होते हैं। –

21

एक UIScrollView की bounds.origin (0, 0) नहीं होगी जब इसकी सामग्री ऑफसेट (0, 0) नहीं है।

19

व्यू का फ्रेम पर्यवेक्षण में स्थान निर्धारित करता है। देखें की सीमा निर्धारित करता है कि सबव्यू स्थान निर्धारित करता है। इसका अर्थ यह है कि, यदि आप दृश्य की सीमा बदलते हैं, तो इसका स्थान बदला नहीं जाएगा, लेकिन इसके सभी सबव्यू स्थान बदल दिए जाएंगे।

सकारात्मक चौड़ाई और ऊंचाई आप ऊपरी-बाएं से नीचे दाएं से एक दृश्य खींचते हैं, जबकि नकारात्मक मान नीचे-दाएं से ऊपरी-बाएं से होता है। तो

frame1 = CGRectMake(100, 100, -50, -50) 

,

frame2 = CGRectMake(50, 50, 50, 50). 

साथ और वास्तव में पूरी तरह से समान है अगर आप frame1 साथ एक दृश्य init, यह स्वतः बदल frame2 को होगा।

लेकिन विचारों के bounds.origin समान नहीं हैं।Bounds.origin उस बिंदु को इंगित करता है कि आप दृश्य को "आकर्षित" करते हैं, इसलिए सभी सबव्यू फ़्रेम इस बिंदु पर उत्पन्न होंगे।

उदाहरण के लिए, लैंडस्केप iPhone 6 में, हमने:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)]; 
leftView.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:leftView]; 

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)]; 
rightView.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:rightView]; 

और हम मिल गया:

enter image description here

हम उस rightView के फ्रेम स्वचालित रूप से सकारात्मक मान में बदल जाता है जो मिलेगा (342, 50, 275, 275), लेकिन इसकी bounts.origin = (-275,-275)

और हम subviews जोड़ें:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
leftSubview.backgroundColor = [UIColor grayColor]; 
[leftView addSubview:leftSubview]; 
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
rightSubview.backgroundColor = [UIColor grayColor]; 
[rightView addSubview:rightSubview]; 

enter image description here

तो सीमा rightView के subview मूल जो हम rightView init इस प्रकार बनाता है।

यदि हम दाएं दृश्य के बाउंड को बाएं में बदलते हैं तो देखें: rightView.bounds = leftView.bounds; फिर दो उप दृश्य स्थान समान हैं, हमने उस जानकारी को खो दिया है जो सही दृश्य की चौड़ाई और ऊंचाई नकारात्मक है।

enter image description here

और हम rightView के बजाय leftView की सीमा बदलने के लिए: CGRect सीमा = leftView.bounds; bounds.origin = CGPointMake (50, 50); leftView.bounds = सीमाएं;

enter image description here

हम देख सकते हैं, अपने subview के frame.origin bounds.origin (ऋण, के साथ साथ नहीं का प्रयोग करके) द्वारा ऑफसेट है।

निष्कर्ष करने के लिए:

  1. view.bounds अपने सभी subview के स्थान (bounds.origin की भरपाई) निर्धारित करता है, जबकि bounds अपने superview में अपने स्वयं के स्थान को प्रभावित नहीं करेगा।

  2. यदि आप नकारात्मक चौड़ाई और ऊंचाई के साथ एक दृश्य में प्रवेश करते हैं, तो यह स्वचालित रूप से सकारात्मक हो जाएगा (जो स्थान को नहीं बदलेगा), लेकिन इसकी बाउंड.ऑरिगिन उस बिंदु को इंगित करती है कि आप दृश्य को "आकर्षित" करना शुरू करते हैं।

+0

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

+0

अच्छा जवाब, चित्रमय प्रतिनिधित्व के साथ चीजों को समझाने के लिए अतिरिक्त समय लेने के लिए धन्यवाद। +1। –