ตั้งแต่คำถามที่ฉันถามถูกพบหลายครั้งฉันจะให้คำตอบโดยละเอียดของมัน อย่าลังเลที่จะแก้ไขหากคุณต้องการเพิ่มเนื้อหาที่ถูกต้องมากขึ้น
ก่อนอื่นสรุปคำถาม: กรอบขอบเขตและศูนย์และความสัมพันธ์ของพวกเขา
มุมมองเฟรม A frame( CGRect) คือตำแหน่งของสี่เหลี่ยมมุมฉากในsuperviewระบบพิกัดของ โดยค่าเริ่มต้นมันเริ่มต้นที่ด้านบนซ้าย
ขอบเขตมุมมองbounds( CGRect) แสดงมุมมองสี่เหลี่ยมผืนผ้าในระบบพิกัดของตัวเอง
ศูนย์ A centerเป็นระบบพิกัดที่CGPointแสดงออกมาในรูปsuperviewแบบและจะกำหนดตำแหน่งของจุดศูนย์กลางที่แน่นอนของมุมมอง
นำมาจากตำแหน่ง UIView +เหล่านี้คือความสัมพันธ์ (พวกเขาไม่ทำงานในรหัสเนื่องจากเป็นสมการที่ไม่เป็นทางการ) ในคุณสมบัติก่อนหน้านี้:
หมายเหตุ:ความสัมพันธ์เหล่านี้ใช้ไม่ได้หากมุมมองหมุน สำหรับข้อมูลเพิ่มเติมฉันจะแนะนำให้คุณดูภาพต่อไปนี้ที่ถ่ายจากThe Kitchen DrawerตามหลักสูตรของStanford 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's 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มุมมอง (ดูสมการก่อนหน้า)
กรณีศึกษาของ View1
นี่คือสิ่งที่เกิดขึ้นเมื่อใช้ตัวอย่างต่อไปนี้
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)
การตั้งค่านี้เป็น YES จะทำให้การแสดงตัวอย่างถูก จำกัด ขอบเขตของผู้รับ หากตั้งค่าเป็น NO ภาพย่อยที่เฟรมขยายเกินขอบเขตที่มองเห็นได้ของผู้รับจะไม่ถูกตัดออก ค่าเริ่มต้นคือ NO
กล่าวอีกนัยหนึ่งถ้ามุมมองframeเป็น(0, 0, 100, 100)และมุมมองย่อยคือ(90, 90, 30, 30)คุณจะเห็นเพียงส่วนหนึ่งของมุมมองย่อยนั้น หลังจะไม่เกินขอบเขตของมุมมองหลัก
masksToBoundsclipsToBoundsเทียบเท่ากับ แทนที่จะไปคุณสมบัตินี้ถูกนำไปใช้กับUIView CALayerภายใต้ประทุน, โทรclipsToBounds masksToBoundsสำหรับการอ้างอิงเพิ่มเติมดูที่ความสัมพันธ์ระหว่าง UOBD ของ ClipToBounds กับ CAL ของมาสก์ได้อย่างไร .