चूंकि मैंने जो सवाल पूछा है, उसे कई बार देखा गया है, मैं इसका विस्तृत जवाब दूंगा। यदि आप अधिक सही सामग्री जोड़ना चाहते हैं, तो इसे संशोधित करने के लिए स्वतंत्र महसूस करें।
पहले प्रश्न पर एक पुनर्कथन: फ्रेम, सीमा और केंद्र और उनके रिश्ते।
फ़्रेम ए व्यूज़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प्रतिनिधित्व करता है, लेकिन केंद्र की स्थिति का वर्णन करता है।viewsuperviewbounds
अंत में, 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 के क्लिपटॉब और कैलेयर के मास्कटॉब के बीच कैसे संबंध है? ।