ตั้งแต่คำถามที่ฉันถามถูกพบหลายครั้งฉันจะให้คำตอบโดยละเอียดของมัน อย่าลังเลที่จะแก้ไขหากคุณต้องการเพิ่มเนื้อหาที่ถูกต้องมากขึ้น
ก่อนอื่นสรุปคำถาม: กรอบขอบเขตและศูนย์และความสัมพันธ์ของพวกเขา
มุมมองเฟรม 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)
คุณจะเห็นเพียงส่วนหนึ่งของมุมมองย่อยนั้น หลังจะไม่เกินขอบเขตของมุมมองหลัก
masksToBounds
clipsToBounds
เทียบเท่ากับ แทนที่จะไปคุณสมบัตินี้ถูกนำไปใช้กับUIView
CALayer
ภายใต้ประทุน, โทรclipsToBounds
masksToBounds
สำหรับการอ้างอิงเพิ่มเติมดูที่ความสัมพันธ์ระหว่าง UOBD ของ ClipToBounds กับ CAL ของมาสก์ได้อย่างไร .