2012-08-31 9 views
10

मैंने UILabel के दो उदाहरण बनाए और उन्हें अपने ViewController के दृश्य में जोड़ा। और फिर मैंने 0.5 से 1.0 (x और y) से प्रत्येक के anchorPoint को बदल दिया।जब मैं अपने एंकरपॉइंट को बदलने के बाद अपना फ्रेम सेट करता हूं तो मेरा दृश्य क्यों चलता है?

अगला, मैंने uiLabel2 के फ्रेम को अपने फ्रेम में रीसेट कर दिया है, मैंने इसे बनाया है: (100,100,100,20)।

जब मैं ऐप चलाता हूं, uiLabel1 और uiLabel2 विभिन्न स्थितियों पर दिखाता है। क्यूं कर?

UILabel *uiLabel1 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel1.text = @"UILabel1"; 
uiLabel1.layer.anchorPoint = CGPointMake(1, 1); 

UILabel *uiLabel2 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel2.text = @"UILabel2"; 
uiLabel2.layer.anchorPoint = CGPointMake(1, 1); 
uiLabel2.frame = CGRectMake(100, 100, 100, 20); 

[self.view addSubview:uiLabel1]; 
[self.view addSubview:uiLabel2]; 

enter image description here

उत्तर

37

एक CALayer निर्धारित जहां यह अपने superlayer में प्रकट होता है कि चार गुण है:

  • position (जो दृश्य के center संपत्ति के रूप में एक ही है)
  • bounds (वास्तव में केवल sizebounds का हिस्सा)
  • anchorPoint
  • transform

आप देखेंगे कि frame उन गुणों में से एक नहीं है। frame संपत्ति वास्तव में उन गुणों से ली गई है। जब आप frame प्रॉपर्टी सेट करते हैं, तो परत वास्तव में आपके द्वारा प्रदान किए गए फ्रेम और परत के मौजूदा anchorPoint पर आधारित center और bounds.size बदलती है।

आप पहली परत बनाने (प्रथम UILabel, जो UIView का एक उपवर्ग है बनाने के द्वारा, और हर UIView एक परत होती है), यह 100,100,100,20 का एक फ्रेम दे रही है। परत में 0.5,0.5 का डिफ़ॉल्ट एंकर पॉइंट होता है। इसलिए यह इसकी सीमाओं को 0,0,100,20 और इसकी स्थिति 150,110 के रूप में गणना करता है। यह इस तरह दिखता है:

anchor at center

तो फिर तुम 1,1 करने के लिए अपने लंगर बिंदु बदल जाते हैं।चूंकि आप परत की स्थिति या सीमाओं को सीधे नहीं बदलते हैं, और आप उन्हें फ्रेम सेट करके अप्रत्यक्ष रूप से नहीं बदलते हैं, इसलिए परत बढ़ जाती है ताकि उसका नया एंकर पॉइंट अपने सुपरलेयर में अपनी (अपरिवर्तित) स्थिति पर हो:

anchor at corner

यदि आप अब परत (या देखें) फ्रेम के लिए पूछते हैं, तो आपको 50,90,100,20 मिलेंगे।

जब आप दूसरी परत बनाते हैं (दूसरे UILabel के लिए), इसके एंकर पॉइंट को बदलने के बाद, आप अपना फ्रेम सेट करते हैं। तो परत एक नई स्थिति गुना फ्रेम उपलब्ध कराने के आधार पर की गणना करता है और अपनी मौजूदा लंगर बिंदु:

anchor at corner with reset frame

आप अपने फ्रेम के लिए परत (या देखें) अब कहते हैं, तो क्या आप फ्रेम मिल जाएगा सेट, 100,100,100,20। लेकिन अगर आप इसकी स्थिति (या दृश्य का केंद्र) मांगते हैं, तो आपको 200,120 मिलेंगे।

+0

अपडेट किया गया ओह! लूट! आपके महान और विस्तृत उत्तर के लिए धन्यवाद। –

4

खैर है कि वास्तव में क्या एक लंगर बिंदु है। एंकर पॉइंट्स बदलने से पहले, आप लेबल के केंद्र के आधार पर फ्रेम सेट कर रहे थे। उसके बाद, आप दाएं कोने के आधार पर फ्रेम सेट कर रहे हैं।

चूंकि आप केवल एक लेबल के लिए फ्रेम को रीसेट कर रहे थे, इसलिए एक ने नए एंकर पॉइंट के आधार पर अपना फ्रेम समायोजित किया और दूसरा पुराना स्थिति पर रहा।

यदि आप उन्हें एक ही बिंदु पर रखना चाहते हैं, तो आपको एंकर पॉइंट को संपादित करने के बाद दोनों को फ्रेम रीसेट करने की आवश्यकता है, या एंकर पॉइंट बिल्कुल नहीं।

This guide एंकर पॉइंट के बारे में और बताता है।

+0

आपकी व्याख्या और दिए गए लिंक मेरे लिए अच्छी मदद कर रहे हैं। –

+0

धन्यवाद KDarker। –

+0

लिंक टूटा हुआ है :( – Nathaniel