clipsToBounds ทำงานอย่างไร


110

ผมอยากจะทราบวิธีการที่จะใช้สถานที่ให้บริการUIViewclipsToBounds

เอกสารอย่างเป็นทางการระบุว่า:

clipsToBounds ทรัพย์สิน

ค่าบูลีนที่กำหนดว่ามุมมองย่อยถูก จำกัด ไว้ที่ขอบเขตของมุมมองหรือไม่

การอภิปราย
การตั้งค่านี้เพื่อYESทำให้มุมมองย่อยถูกตัดไปที่ขอบเขตของเครื่องรับ หากตั้งค่าเป็นมุมมองย่อยNOที่เฟรมขยายเกินขอบเขตที่มองเห็นได้ของเครื่องรับจะไม่ถูกตัดออก NOค่าเริ่มต้นคือ

แต่ฉันไม่ชัดเจนว่านี่หมายถึงอะไรกันแน่ ฉันควรใช้clipsToBoundsอย่างไร? ผลของการตั้งค่าคุณสมบัตินี้เป็นYESอย่างไร หรือเพื่อNO?

คำตอบ:


283

ถ้าซูเปอร์วิวของฉันเป็นช่องที่มีขนาด 10 หน่วยในแต่ละด้านและมุมมองย่อยของฉันกว้าง 20 หน่วยเมื่อclipsToBoundsตั้งค่าเป็นYESฉันจะเห็นเฉพาะส่วนของมุมมองย่อยที่อยู่ในขอบเขตของซุปเปอร์วิวเท่านั้น มิฉะนั้นหากclipsToBoundsตั้งค่าเป็นNOฉันจะเห็นมุมมองย่อยทั้งหมดแม้แต่ส่วนที่อยู่นอกซูเปอร์วิว (สมมติว่าเรายังอยู่บนหน้าจอ)

ตัวอย่างภาพให้พิจารณามุมมองต่อไปนี้ที่ตั้งค่าบนกระดานเรื่องราว:

ใส่คำอธิบายภาพที่นี่

นี้เป็นสีขาวUIViewป้ายในด้านบนซ้ายมุมมีทั้งง่าย "1" หรือ "2" เพื่อที่ฉันสามารถพูดคุยเหล่านี้หรือview1 view2นอกจากนี้มุมมองสีดำยังมีขนาดเท่ากับมุมมองสีขาว แต่จุดเริ่มต้นอยู่ที่จุดศูนย์กลางของมุมมองสีขาว

ในviewDidLoadวิธีของตัวควบคุมมุมมองเรามีรหัสต่อไปนี้:

วัตถุประสงค์ -C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

รวดเร็ว:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

เมื่อเรารันโค้ดและดูในโปรแกรมจำลองหรือบนอุปกรณ์เราจะได้ผลลัพธ์ดังต่อไปนี้:

ใส่คำอธิบายภาพที่นี่

ดังนั้นแม้ว่ามุมมองเหล่านี้จะถูกตั้งค่าเหมือนกัน (ยกเว้นclipsToBounds) แต่ก็ดูแตกต่างกัน นี่คือสิ่งที่clipsToBoundsทำ การตั้งค่าเป็นYESจะให้ผลลัพธ์ด้านบนในขณะที่ตั้งค่าNOให้เป็นผลลัพธ์ด้านล่าง

หากเราดีบักลำดับชั้นของมุมมองเราจะเห็นได้ชัดเจนยิ่งขึ้นว่ากล่องดำทั้งสองนั้นขยายผ่านมุมมองสีขาวไปแล้ว แต่มุมมอง 2 เท่านั้นที่แสดงสิ่งนี้เมื่อแอปทำงานจริง:

ใส่คำอธิบายภาพที่นี่


3
คำตอบสุดวิเศษ! ทำได้ดี. แต่ฉันมีคำถาม เหตุใดจึงUITextViewมองไม่เห็นเงาถ้าclipsToBoundsคุณสมบัติเท่ากับtrue; เหรอ? ถ้าเป็นเช่นนั้นก็falseใช้ได้ดี
Mannopson

1
หมายเหตุ: เป็นมุมมองหลักที่คุณเปลี่ยน clipsToBounds บน ดังนั้นถ้า viewB เป็นมุมมองย่อยของ viewA เป็นมุมมองที่ต้องทำให้ clipsToBounds เป็นจริง
aestusLabs

มุมมองใดที่แสดงจากกรอบมุมมองเดิมในมุมมองนั้นคือท่าทางสัมผัสที่ใช้งานได้เพราะฉันตรวจสอบแล้วมันไม่ทำงาน
Pravin Tate

2

นี่หมายถึงคำตอบด่วนที่รวบรัดเทียบกับคำตอบที่ยอมรับ

clipSubviewsToBoundsถ้าแอปเปิ้ลที่จะเปลี่ยนชื่อคุณสมบัตินี้ผมตั้งชื่อมันว่า:

ฉันเพิ่งพบข้อผิดพลาดในโค้ดของเรา 0ในกรณีที่มีความสูงมุมมองของผู้ปกครองได้รับการตั้งค่าให้ เราคาดว่าจะไม่เห็นองค์ประกอบใดเลย ยังมีการแสดงเนื้อหาของมุมมองผู้ปกครอง

มันเป็นเพราะไม่ได้รับการตั้งค่าให้clipToBounds trueเมื่อตั้งค่าtrueเป็นความสูงของมุมมองย่อยแล้วจะไม่สามารถขยายไปได้ไกลกว่า0นั้นดังนั้นจึงไม่แสดงเลย


คำตอบนี้มีการประเมินต่ำ
sasquatch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.