Apple ได้กำหนดวิธีการแบ่งคลาสย่อยUIViewใน doc อย่างชัดเจน
ตรวจสอบรายชื่อด้านล่างนี้โดยเฉพาะอย่างยิ่งจะดูที่และinitWithFrame: layoutSubviewsอดีตมีวัตถุประสงค์เพื่อตั้งค่าเฟรมของคุณUIViewในขณะที่หลังมีวัตถุประสงค์เพื่อตั้งค่าเฟรมและเค้าโครงของการชมย่อย
โปรดจำไว้ด้วยว่าinitWithFrame:จะมีการเรียกเฉพาะเมื่อคุณสร้างUIViewโปรแกรมของคุณแบบทันที หากคุณกำลังโหลดจากไฟล์ปลายปากกา (หรือกระดานเรื่องราว) initWithCoder:จะถูกนำมาใช้ และในinitWithCoder:เฟรมยังไม่ได้รับการคำนวณดังนั้นคุณจึงไม่สามารถแก้ไขเฟรมที่คุณติดตั้งในเครื่องมือสร้างอินเตอร์เฟส ตามที่แนะนำในคำตอบนี้คุณอาจนึกถึงการโทรinitWithFrame:จากinitWithCoder:เพื่อตั้งค่าเฟรม
ท้ายที่สุดถ้าคุณโหลดUIViewจากปลายปากกา (หรือกระดานเรื่องราว) คุณก็มีawakeFromNibโอกาสที่จะทำการกำหนดค่าเริ่มต้นของเฟรมและเลย์เอาต์ที่กำหนดเองเนื่องจากเมื่อawakeFromNibมีการเรียกว่ามันรับประกันว่าทุกมุมมองในลำดับชั้นไม่ได้ถูกเก็บถาวร
จากเอกสารของNSNibAwaking(ตอนนี้แทนที่โดยเอกสารของawakeFromNib):
ข้อความไปยังวัตถุอื่นสามารถส่งได้อย่างปลอดภัยจากภายใน awakeFromNib ซึ่งเป็นเวลาที่มั่นใจได้ว่าวัตถุทั้งหมดจะไม่ได้รับการเก็บถาวรและกำหนดค่าเริ่มต้น (แม้ว่าจะไม่ถูกกระตุ้นก็ตาม)
นอกจากนี้ยังเป็นที่น่าสังเกตว่าด้วยการชำระอัตโนมัติคุณไม่ควรกำหนดกรอบมุมมองของคุณอย่างชัดเจน แต่คุณควรระบุชุดของข้อ จำกัด ที่เพียงพอเพื่อให้เครื่องคำนวณโครงร่างโดยอัตโนมัติ
ส่งตรงจากเอกสาร :
วิธีการแทนที่
การเริ่มต้น
initWithFrame:ขอแนะนำให้คุณใช้วิธีนี้ นอกจากนี้คุณยังสามารถใช้วิธีการกำหนดค่าเริ่มต้นที่กำหนดเองนอกเหนือจากหรือแทนวิธีนี้
initWithCoder: ใช้วิธีนี้หากคุณโหลดมุมมองจากไฟล์ปลายปากกา Interface Builder และมุมมองของคุณต้องมีการกำหนดค่าเริ่มต้นเอง
layerClassใช้วิธีนี้เฉพาะเมื่อคุณต้องการให้มุมมองของคุณใช้เลเยอร์แกนแอนิเมชั่นอื่นสำหรับที่เก็บข้อมูลสำรอง ตัวอย่างเช่นถ้าคุณใช้ OpenGL ES เพื่อวาดภาพคุณต้องการแทนที่วิธีนี้และส่งคืนคลาส CAEAGLLayer
การวาดและการพิมพ์
drawRect:ใช้วิธีนี้หากมุมมองของคุณวาดเนื้อหาที่กำหนดเอง หากมุมมองของคุณไม่ได้วาดรูปแบบกำหนดเองใด ๆ หลีกเลี่ยงการเอาชนะวิธีนี้
drawRect:forViewPrintFormatter: ใช้วิธีนี้เฉพาะเมื่อคุณต้องการวาดเนื้อหามุมมองของคุณแตกต่างกันระหว่างการพิมพ์
ข้อ จำกัด
requiresConstraintBasedLayout ใช้วิธีคลาสนี้หากคลาสมุมมองของคุณต้องการข้อ จำกัด ในการทำงานอย่างถูกต้อง
updateConstraints ใช้วิธีนี้หากมุมมองของคุณต้องการสร้างข้อ จำกัด ที่กำหนดเองระหว่างการดูย่อยของคุณ
alignmentRectForFrame:, frameForAlignmentRect:ใช้วิธีการเหล่านี้เพื่อลบล้างวิธีการจัดมุมมองของคุณกับมุมมองอื่น ๆ
แบบ
sizeThatFits:ใช้วิธีนี้หากคุณต้องการให้มุมมองของคุณมีขนาดเริ่มต้นแตกต่างจากปกติในระหว่างการปรับขนาดการดำเนินการ ตัวอย่างเช่นคุณอาจใช้วิธีนี้เพื่อป้องกันไม่ให้มุมมองของคุณหดตัวจนถึงจุดที่ไม่สามารถแสดงภาพตัวอย่างได้อย่างถูกต้อง
layoutSubviews ใช้วิธีการนี้หากคุณต้องการการควบคุมเลย์เอาต์ของการชมย่อยของคุณอย่างแม่นยำกว่าข้อ จำกัด หรือพฤติกรรมการทำให้เป็นอัตโนมัติ
didAddSubview:, willRemoveSubview:ใช้วิธีการเหล่านี้ตามความจำเป็นเพื่อติดตามการเพิ่มและการลบการชมย่อย
willMoveToSuperview:, didMoveToSuperviewใช้วิธีการเหล่านี้เป็นสิ่งจำเป็นในการติดตามการเคลื่อนไหวของมุมมองปัจจุบันในลำดับชั้นมุมมองของคุณ
willMoveToWindow:, didMoveToWindowใช้วิธีการเหล่านี้เป็นสิ่งจำเป็นในการติดตามการเคลื่อนไหวของมุมมองของคุณไปยังหน้าต่างที่แตกต่างกัน
การจัดการเหตุการณ์:
touchesBegan:withEvent:, touchesMoved:withEvent:, touchesEnded:withEvent:, touchesCancelled:withEvent:ใช้วิธีการเหล่านี้ถ้าคุณจำเป็นต้องจัดการกับเหตุการณ์การสัมผัสโดยตรง (สำหรับการป้อนข้อมูลด้วยท่าทางให้ใช้ตัวจดจำลายเส้น)
gestureRecognizerShouldBegin: ใช้วิธีนี้หากมุมมองของคุณจัดการกิจกรรมการสัมผัสโดยตรงและอาจต้องการป้องกันตัวจดจำท่าทางสัมผัสที่แนบมาไม่ให้ทำงานเพิ่มเติม