चूंकि मैंने जो सवाल पूछा है, उसे कई बार देखा गया है, मैं इसका विस्तृत जवाब दूंगा। यदि आप अधिक सही सामग्री जोड़ना चाहते हैं, तो इसे संशोधित करने के लिए स्वतंत्र महसूस करें।
पहले प्रश्न पर एक पुनर्कथन: फ्रेम, सीमा और केंद्र और उनके रिश्ते।
फ़्रेम ए व्यूज़frame
( CGRect
) की आयत superview
प्रणाली में इसकी आयत की स्थिति है। डिफ़ॉल्ट रूप से यह शीर्ष बाईं ओर शुरू होता है।
सीमाएं एक दृश्य का bounds
( CGRect
) अपने स्वयं के समन्वय प्रणाली में एक दृश्य आयत को व्यक्त करता है।
केंद्र A center
को समन्वय प्रणाली के CGPoint
रूप में व्यक्त किया गया superview
है और यह दृश्य के सटीक केंद्र बिंदु की स्थिति निर्धारित करता है।
पिछले गुणों के बीच UIView + स्थिति से लिया गया ये संबंध हैं (वे कोड में काम नहीं करते हैं क्योंकि वे अनौपचारिक समीकरण हैं):
नोट: ये रिश्ते लागू नहीं होते यदि दृश्य घुमाए जाते हैं। अधिक जानकारी के लिए, मैं आपको सुझाव दूंगा कि आप स्टैनफोर्ड CS193p पाठ्यक्रम पर आधारित द किचन ड्रावर से ली गई छवि पर एक नज़र डालें । क्रेडिट्स @Rhubarb को जाता है ।
आप का उपयोग करने के लिए frame
अनुमति देता है और इसके भीतर एक दृश्य का आकार बदलने के लिए / या superview
। आमतौर पर इसका उपयोग superview
उदाहरण के लिए किया जा सकता है , जब आप एक विशिष्ट सबव्यू बनाते हैं। उदाहरण के लिए:
// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
जब आपको अपने अंदर ड्राइंग करने के लिए निर्देशांक की आवश्यकता होती है तो view
आप आमतौर पर संदर्भित करते हैं bounds
। एक विशिष्ट उदाहरण view
पहले के इनसेट के रूप में एक सबव्यू के भीतर आकर्षित करने के लिए हो सकता है । सबव्यू को आकर्षित करने के लिए सुपरवाइज का पता होना चाहिए bounds
। उदाहरण के लिए:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
जब आप bounds
किसी दृश्य को बदलते हैं तो विभिन्न व्यवहार होते हैं। उदाहरण के लिए, यदि आप परिवर्तन करते हैं bounds
size
, तो frame
परिवर्तन (और इसके विपरीत)। center
दृश्य के आसपास परिवर्तन होता है । नीचे दिए गए कोड का उपयोग करें और देखें कि क्या होता है:
NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));
CGRect frame = view2.bounds;
frame.size.height += 20.0f;
frame.size.width += 20.0f;
view2.bounds = frame;
NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));
इसके अलावा, यदि आप बदलते bounds
origin
हैं तो आप origin
इसकी आंतरिक समन्वय प्रणाली को बदल देते हैं। डिफ़ॉल्ट रूप origin
से (0.0, 0.0)
(शीर्ष बाएं कोने में) है। उदाहरण के लिए, अगर आप को बदलने origin
के लिए view1
आप देख सकते हैं (पिछले कोड अगर आप चाहते हैं टिप्पणी) के लिए है कि अब ऊपरी बाएं कोने view2
छूता view1
है। प्रेरणा काफी सरल है। आप कहते हैं कि करने के लिए view1
है कि इसके ऊपर बाएं कोने अब स्थान पर है (20.0, 20.0)
लेकिन जब से view2
की frame
origin
से शुरू होता है (20.0, 20.0)
, वे मेल खाना होगा।
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
अपने भीतर की स्थिति का origin
प्रतिनिधित्व करता है, लेकिन केंद्र की स्थिति का वर्णन करता है।view
superview
bounds
अंत में, bounds
और origin
संबंधित अवधारणाएं नहीं हैं। दोनों frame
एक दृश्य को प्राप्त करने की अनुमति देते हैं (पिछले समीकरण देखें)।
देखें 1 का केस स्टडी
यहाँ निम्नलिखित स्निपेट का उपयोग करते समय क्या होता है।
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));
सापेक्ष छवि।
इसके बजाय अगर मैं [self view]
निम्नलिखित की तरह सीमा को बदल दूं तो क्या होगा ।
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
सापेक्ष छवि।
यहाँ आप कहते हैं [self view]
कि इसका ऊपरी बायां कोना अभी (30.0, 20.0) की स्थिति में है, लेकिन चूँकि view1
फ्रेम की उत्पत्ति (30.0, 20.0) से शुरू होती है, वे संयोग करेंगे।
अतिरिक्त संदर्भ (यदि आप चाहें तो अन्य संदर्भों के साथ अद्यतन करने के लिए)
के बारे में clipsToBounds
(स्रोत Apple doc)
इस वैल्यू को YES में सेट करने से सबव्यूवर को रिसीवर की सीमा में जाना पड़ता है। अगर NO पर सेट किया जाता है, तो ऐसे सबव्यूअर, जिनके फ्रेम रिसीवर के दृश्यमान सीमा से परे होते हैं, क्लिप नहीं होते हैं। यह डिफ़ॉल्ट मान नहीं है।
दूसरे शब्दों में, यदि कोई दृश्य frame
है (0, 0, 100, 100)
और उसका सबव्यू है (90, 90, 30, 30)
, तो आप उस सबव्यू का केवल एक हिस्सा देखेंगे। उत्तरार्द्ध मूल दृश्य की सीमा से अधिक नहीं होगा।
masksToBounds
के बराबर है clipsToBounds
। ए के बजाय UIView
, यह संपत्ति ए पर लागू होती है CALayer
। हुड के तहत, clipsToBounds
कॉल masksToBounds
। आगे के संदर्भों के लिए एक नज़र डालें कि UIView के क्लिपटॉब और कैलेयर के मास्कटॉब के बीच कैसे संबंध है? ।