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:
ใช้วิธีนี้หากมุมมองของคุณจัดการกิจกรรมการสัมผัสโดยตรงและอาจต้องการป้องกันตัวจดจำท่าทางสัมผัสที่แนบมาไม่ให้ทำงานเพิ่มเติม