যেহেতু আমি জিজ্ঞাসা করা প্রশ্নটি বহুবার দেখা হয়েছে আমি এর বিস্তারিত উত্তর সরবরাহ করব। আপনি যদি আরও সঠিক সামগ্রী যুক্ত করতে চান তবে এটি নির্দ্বিধায় অনুভব করুন।
প্রথমে প্রশ্নের পুনরুদ্ধার: ফ্রেম, সীমানা এবং কেন্দ্র এবং তাদের সম্পর্ক।
ফ্রেম একটি দর্শন frame
( CGRect
) superview
এর সমন্বয় সিস্টেমে এর আয়তক্ষেত্রের অবস্থান । ডিফল্টরূপে এটি উপরের বাম দিকে শুরু হয়।
বাউন্ডস একটি দৃশ্যের bounds
( CGRect
) তার নিজস্ব সমন্বয় ব্যবস্থাতে একটি দর্শন আয়তক্ষেত্রকে প্রকাশ করে।
সেন্টার একটি center
একটি হয় CGPoint
পরিপ্রেক্ষিতে প্রকাশ superview
এর তুল্য সিস্টেম এবং এটি দেখতে সঠিক কেন্দ্রবিন্দু অবস্থান নির্ধারণ করে।
পূর্ববর্তী বৈশিষ্ট্যগুলির মধ্যে ইউআইভিউ + অবস্থান থেকে নেওয়া এই সম্পর্কগুলি (তারা কোডে কাজ করে না কারণ তারা অনানুষ্ঠানিক সমীকরণ):
দ্রষ্টব্য: দর্শনগুলি ঘোরানো হলে এই সম্পর্কগুলি প্রযোজ্য নয়। আরও তথ্যের জন্য, আমি আপনাকে স্ট্যানফোর্ড সিএস 193 পি কোর্সের উপর ভিত্তি করে দ্য কিচেন ড্রয়ার থেকে নেওয়া নিম্নলিখিত চিত্রটি একবার দেখে নেওয়ার পরামর্শ দেব । ক্রেডিটগুলি @ রবার্বে যায় ।
অনুমতিগুলি ব্যবহার করে 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
এর অভ্যন্তরীণ সমন্বয় ব্যবস্থাটি পরিবর্তন করুন change ডিফল্টরূপে 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
(উত্স অ্যাপল ডক)
YES এ এই মানটি সেট করার ফলে সাবভিউগুলি রিসিভারের সীমানায় ক্লিপ হয়ে যায়। যদি NO তে সেট করা থাকে তবে সাবভিউগুলি যার ফ্রেমগুলি রিসিভারের দৃশ্যমান সীমার বাইরে প্রসারিত হবে না তা ছাঁটা হয় না। ডিফল্ট মান নেই.
অন্য কথায়, যদি কোনও দৃশ্যের frame
হয় (0, 0, 100, 100)
এবং এর সংক্ষিপ্তসার হয় (90, 90, 30, 30)
, আপনি সেই সংক্ষিপ্তসারটির কেবলমাত্র একটি অংশ দেখতে পাবেন। দ্বিতীয়টি পিতামাতার দৃশ্যের সীমা অতিক্রম করবে না।
masksToBounds
সমতূল্য clipsToBounds
। পরিবর্তে একটি UIView
, এই সম্পত্তি একটি প্রয়োগ করা হয় CALayer
। ফণা নীচে, clipsToBounds
কল masksToBounds
। আরও রেফারেন্সের জন্য ইউআইভিউ-র ক্লিপস টোবাউন্ডস এবং ক্যালিয়ারের মাস্কস টোবাউন্ডসের মধ্যে কীভাবে সম্পর্ক রয়েছে তা একবার দেখুন ।