การเพิ่มขนาดมาสก์อัตโนมัติโดยทางโปรแกรมเทียบกับ Interface Builder / xib / nib


216

ฉันอยู่ในสมมติฐาน (อาจเป็นเท็จ) ว่าการเปิดใช้งานตัวบ่งชี้ระยะขอบขวาใน xib เทียบเท่ากับการใช้UIViewAutoresizingFlexibleLeftMarginรหัสภายในและอื่น ๆ

ดังนั้นฉันเคยคิดตามภาพรวมนี้: ป้อนคำอธิบายรูปภาพที่นี่

ต่อมาวันนี้ฉันต้องข้ามการตรวจสอบและสะดุดกับหัวข้อนี้

และเอกสารประกอบของแอปเปิลมีสิทธิ์ในส่วนที่มีชื่อเรื่อง - "การจัดการเลย์เอาท์การเปลี่ยนแปลงโดยอัตโนมัติโดยใช้กฎการเพิ่มขนาดอัตโนมัติ" ในลิงค์นี้: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

ดังนั้นตอนนี้ฉันจึงมีแนวคิดใหม่ในใจของฉันเกี่ยวกับวิธีการตั้งค่ามาสก์การเปลี่ยนขนาดอัตโนมัติโดยทางโปรแกรมให้เทียบเท่ากับการตั้งค่า xib:

สถานการณ์ที่ 1 : การตั้งค่าเท่านั้น(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)เทียบเท่ากับ:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

ใน XIB?

สถานการณ์ที่ 2 : การตั้งค่า(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)ในรหัสเทียบเท่ากับ:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHighMentin | UIViewAutoresizingFlexibleHighMentin

ใน XIB?

2 สถานการณ์ที่ต่ออายุของฉันถูกต้องหรือไม่ ตอนนี้ฉันเข้าใจแล้วหรือยัง?


3
คุณล้อฉันเล่น? แต่ดูเหมือนจะมีความสับสนของฉันเช่นกัน ดังนั้นถ้าฉันต้องการกอดด้านบนฉันเปิด autoresize ด้านล่าง แอปเปิ้ลดีงาน นี่คือการตั้งค่าที่งี่เง่าที่สุดที่ฉันเคยเห็น
user4951

1
ถ้าคุณต้องการกอดด้านบนคุณต้องแน่ใจว่าคุณจะไม่พูดถึง UIViewAutoresizingFlexibleTopMargin ในรหัสรูปแบบบิต ข้อสันนิษฐานก่อนหน้านี้ของฉันผิดและนั่นคือสาเหตุที่ฉันโพสต์คำถามนี้เพื่อล้างสิ่งต่างๆ
Raj Pawan Gumdal

สมมติฐานของคุณถูกต้อง คุณผิดที่ไหน
user4951

ใช่ทั้งสองสถานการณ์ที่คุณอ้างถูกต้อง

3
ฉันทำเครื่องมือง่าย ๆ สำหรับสิ่งนี้: erkanyildiz.me/lab/autoresizingmaskคุณสามารถใช้มันได้
erkanyildiz

คำตอบ:


35

ใช่เครื่องมือสร้างส่วนต่อประสานมี "ย้อนกลับ" ในแง่หนึ่ง (หรือ UIView ขึ้นอยู่กับว่าคุณมองอย่างไร) อ้างถึง "สถานการณ์" ของคุณถูกต้อง


47

ใช่คุณอ้างอย่างถูกต้อง นอกจากนี้ฉันยอมรับว่ามันให้ความรู้สึกย้อนหลังเล็กน้อยด้วยเหตุนี้ฉันจึงชื่นชมโพสต์ของคุณ

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

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

การใช้UIViewAutoresizingFlexibleMarginsจะทำให้องค์ประกอบ UI อยู่กึ่งกลางเนื่องจากจะไม่ถูกกอดด้านใดด้านหนึ่ง ในการทำให้องค์ประกอบเติบโต / หดตัวพร้อมกับพาเรนต์ให้ตั้งค่าUIViewAutoresizingFlexibleWidthและUIViewAutoresizingFlexibleHeightตามลำดับ

ฉันชอบใช้UIViewAutoresizingFlexibleMarginsเพราะฉันสามารถอ้างอิงได้ในภายหลังเช่น:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

แทน

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

บ่อยครั้งที่ฉันเห็นระยะขอบเหล่านี้หรือรวมเข้าด้วยกันในหนึ่งบรรทัดเช่นตัวอย่างด้านบน อ่านยาก


4
ควรยืดหยุ่นในทุกทิศทาง (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) ฉันเดาได้ไหม หรือฉันสับสนอีกครั้ง!
Raj Pawan Gumdal

4
FlexibleMargins จะทำให้องค์ประกอบอยู่กึ่งกลาง (ไม่ได้กอดขอบซ้ายด้านบนขวาหรือล่าง) ความกว้าง / ความสูงที่ยืดหยุ่นได้จะทำให้องค์ประกอบ UI เติบโต / หดตามลำดับ
แซม

4
ทุกอย่างชัดเจนแล้วหรือ นอกจากนี้ฉันหมายถึงมันจริงๆเมื่อฉันบอกว่าฉันชื่นชมโพสต์ ฉันชอบมันมาก b / c สิ่งนี้ทำให้ฉันสับสนในอดีต ฉันคิดว่ามันยอดเยี่ยม Q.
Sam

3
ใช่ขอบคุณตอนนี้ฉันได้รับ "ระยะขอบที่ยืดหยุ่น" และ "ความกว้าง / ความสูงแบบยืดหยุ่น" ที่อธิบายมันทั้งหมดและคุณ "ไม่ได้กอดซ้ายด้านบนขวาหรือขอบด้านล่าง" เป็นวิธีที่ดีของการอธิบาย :)
ราชา Pawan Gumdal

0

ป้อนคำอธิบายรูปภาพที่นี่

การเปิดใช้งานลูกศรแนวตั้ง / แนวนอน(เรียกว่าสปริง)ภายในกล่องจะทำให้ความสูง / ความกว้างมีความยืดหยุ่น แต่การเปิดใช้งานสายภายนอก(เรียกว่า strut)จะทำให้ด้านนั้นยืดหยุ่น / ไม่ยืดหยุ่น

การเปิดใช้งานเส้นด้านซ้ายด้านนอก(ป๋อซ้าย)UIViewAutoresizingFlexibleRightMarginจะไม่เทียบเท่ากับการเปิดใช้งาน แต่UIViewAutoresizingFlexibleRightMargin= บนถ้าป๋อขวาปิดการใช้งานปิดถ้าป๋อขวาเปิดการใช้งาน

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


0

Swift 4 ใช้สิ่งนี้

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objective-C

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