กรอบขอบเขตศูนย์จุดกำเนิดของ UIView จะใช้อะไรเมื่อไร


195

UIViewมีคุณสมบัติframe, bounds, centerและoriginและพวกเขาทั้งหมดดูเหมือนจะมีความสัมพันธ์กัน ส่วนใหญ่เวลาที่ผมจัดการกับเมื่อตั้งค่าตำแหน่งและขนาดของframe UIViewฉันเข้าใจว่าframeกำลังใช้ระบบพิกัดทั่วโลกและboundsกำลังใช้พิกัดของมุมมองในเครื่อง (ดังนั้น x และ y ของมันคือ 0 แต่ไม่เสมอไป) แต่ก็ยังทำให้ฉันสับสนเมื่อต้องใช้อะไร

ภายใต้บริบท (และสิ่งที่เป็นเวลาที่เหมาะสม) คุณสมบัติอื่น ๆ ( bounds, center, origin) ควรจะใช้งานอย่างไร


ลิงค์ด้านล่างมีคำตอบที่ดีที่สุด stackoverflow.com/questions/5361369/…
Ohmy

กรอบ vs ขอบเขตด้วยรูปภาพ: stackoverflow.com/a/28917673/3681880
Suragch

คำตอบ:


241

คำตอบของมาร์โกข้างต้นนั้นถูกต้อง แต่เพียงขยายคำถาม "ภายใต้บริบท" ...

frame - นี่เป็นคุณสมบัติที่คุณมักใช้กับแอปพลิเคชั่น iPhone ปกติ การควบคุมส่วนใหญ่จะถูกจัดวางโดยสัมพันธ์กับการควบคุม "บรรจุ" ดังนั้นเฟรมผู้ใช้จะตรงกับตำแหน่งที่ตัวควบคุมต้องการแสดงและ frame.size จะเป็นตัวกำหนดขนาดของการควบคุม

center - นี่คือคุณสมบัติที่คุณน่าจะให้ความสำคัญกับเกมแบบสไปรต์และภาพเคลื่อนไหวที่อาจมีการเคลื่อนไหวหรือการปรับสเกล โดยค่าเริ่มต้นการเคลื่อนไหวและการหมุนจะขึ้นอยู่กับศูนย์กลางของ UIView มันไม่ค่อยเหมาะสมที่จะลองและจัดการวัตถุดังกล่าวด้วยคุณสมบัติเฟรม

ขอบเขต - คุณสมบัตินี้ไม่ได้เป็นคุณสมบัติการวางตำแหน่ง แต่กำหนดพื้นที่ drawable ของ UIView "ญาติ" กับกรอบ โดยค่าเริ่มต้นคุณสมบัตินี้มักจะเป็น (0, 0, ความกว้าง , ความสูง ) การเปลี่ยนคุณสมบัตินี้จะช่วยให้คุณวาดนอกกรอบหรือ จำกัด การวาดไปยังพื้นที่ที่เล็กกว่าภายในเฟรม การอภิปรายที่ดีเกี่ยวกับเรื่องนี้สามารถดูได้ที่ลิงค์ด้านล่าง มันผิดปกติสำหรับคุณสมบัตินี้ที่จะจัดการเว้นแต่มีความต้องการเฉพาะในการปรับภูมิภาคการวาด ข้อยกเว้นเพียงอย่างเดียวคือโปรแกรมส่วนใหญ่จะใช้การ[[UIScreen mainScreen] bounds]เริ่มต้นบนเพื่อกำหนดพื้นที่ที่มองเห็นได้สำหรับแอปพลิเคชันและตั้งค่าเฟรมของ UIView เริ่มต้นให้สอดคล้องกัน

เหตุใดจึงมีกรอบสี่เหลี่ยมและสี่เหลี่ยมผืนผ้าใน UIView

หวังว่านี่จะช่วยชี้แจงสถานการณ์ที่อาจใช้ทรัพย์สินแต่ละแห่ง


33
ฉันคิดว่ามันคุ้มค่าที่boundsจะใช้กันทั่วไปเมื่อมุมมองมีการแปลงที่นำไปใช้กับมัน ภายใต้สถานการณ์เหล่านี้frameคุณสมบัติจะไม่ได้กำหนด ตามที่ระบุไว้โดยคำตอบอื่น ๆ ให้ปรับเปลี่ยนcenterและboundsเทียบเท่ากับการปรับเปลี่ยนตำแหน่งและขนาดของมุมมองตามลำดับ
จวร์ต

36

เป็นค่าที่เกี่ยวข้องและรักษาความสอดคล้องกันโดยเมธอด setter / getter (และการใช้ความจริงที่ว่า frame เป็นค่าที่ถูกสังเคราะห์อย่างหมดจดไม่ได้รับการสนับสนุนจากตัวแปรอินสแตนซ์จริง)

สมการหลักคือ:

frame.origin = center - bounds.size / 2

(ซึ่งเหมือนกับ)

center = frame.origin + bounds.size / 2

(และยังมี)

frame.size = bounds.size

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

ทุกสิ่งนี้ได้รับการอธิบายอย่างละเอียดพร้อมมินิไลบรารีที่มีประโยชน์ที่นี่:

http://bynomial.com/blog/?p=24


18

คุณสมบัติcenter, boundsและframeมีการเชื่อมต่อกัน: การเปลี่ยนแปลงอย่างใดอย่างหนึ่งจะอัปเดตคนอื่น ๆ เพื่อใช้พวกเขา แต่คุณต้องการ ตัวอย่างเช่นแทนที่จะแก้ไข x / y params ของframeเพื่อเลื่อนมุมมองใหม่เพียงแค่อัพเดตcenterคุณสมบัติ

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