คำถามติดแท็ก autolayout

Auto Layout เป็นระบบโครงร่างส่วนต่อประสานผู้ใช้ที่อธิบายถึงข้อ จำกัด สำหรับ OS X และ iOS

4
วิธีการดักจับบน UIViewAlertForUns ไม่พอใจข้อ จำกัด ?
ฉันเห็นข้อผิดพลาดปรากฏในบันทึกการดีบักเกอร์: Will attempt to recover by breaking constraint <NSLayoutConstraint:0x191f0920 H:[MPKnockoutButton:0x17a876b0]-(34)-[MPDetailSlider:0x17a8bc50](LTR)> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. ฉันจะดักการโทรนั้นได้อย่างไร มันไม่ปรากฏที่ใดในรหัสของฉัน

2
setNeedsLayout vs. setNeedsUpdateConstraints และ layoutIfNeeded vs updateConstraintsIfNeeded
ฉันรู้ว่าห่วงโซ่การจัดวางอัตโนมัติประกอบด้วยกระบวนการที่แตกต่างกัน 3 ประการ อัปเดตข้อ จำกัด มุมมองเค้าโครง (นี่คือที่ที่เราได้รับการคำนวณเฟรม) แสดง อะไรไม่ได้โดยสิ้นเชิงชัดเจนกับผมคือความแตกต่างระหว่างภายในและ-setNeedsLayout -setNeedsUpdateConstraintsจาก Apple Docs: setNeedsLayout เรียกวิธีนี้ในเธรดหลักของแอปพลิเคชันของคุณเมื่อคุณต้องการปรับเค้าโครงของมุมมองย่อย วิธีนี้จะทำการบันทึกคำขอและส่งคืนทันที เนื่องจากวิธีนี้ไม่ได้บังคับให้มีการอัปเดตทันที แต่รอรอบการอัปเดตครั้งต่อไปคุณสามารถใช้วิธีนี้เพื่อทำให้เค้าโครงของมุมมองหลายมุมเป็นโมฆะก่อนที่มุมมองเหล่านั้นจะได้รับการอัปเดต ลักษณะการทำงานนี้ช่วยให้คุณสามารถรวมการปรับปรุงเค้าโครงทั้งหมดของคุณเข้ากับรอบการอัปเดตเดียวซึ่งมักจะดีกว่าสำหรับประสิทธิภาพ setNeedsUpdateConstraints เมื่อคุณสมบัติของมุมมองที่กำหนดเองของคุณเปลี่ยนไปในแบบที่จะส่งผลกระทบต่อข้อ จำกัด คุณสามารถเรียกวิธีนี้เพื่อระบุว่าข้อ จำกัด จำเป็นต้องได้รับการปรับปรุงในบางจุดในอนาคต จากนั้นระบบจะเรียกใช้ updateConstraints โดยเป็นส่วนหนึ่งของเค้าโครงผังปกติ การอัปเดตข้อ จำกัด ทั้งหมดในครั้งเดียวก่อนที่จะมีความจำเป็นต้องมั่นใจว่าคุณไม่จำเป็นต้องคำนวณข้อ จำกัด โดยไม่จำเป็นเมื่อมีการเปลี่ยนแปลงหลายอย่างในมุมมองของคุณระหว่างการส่งผ่านเลย์เอาต์ เมื่อฉันต้องการทำให้มุมมองเคลื่อนไหวหลังจากแก้ไขข้อ จำกัด และทำให้การเปลี่ยนแปลงที่ฉันมักจะเรียกเช่น: [UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{ [self.modifConstrView setNeedsUpdateConstraints]; [self.modifConstrView layoutIfNeeded]; } completion:NULL]; ฉันพบว่าถ้าฉันใช้-setNeedsLayoutแทน-setNeedsUpdateConstraintsทุกอย่างทำงานตามที่คาดไว้ แต่ถ้าฉันเปลี่ยน-layoutIfNeededด้วย-updateConstraintsIfNeededภาพเคลื่อนไหวจะไม่เกิดขึ้น …

16
UICollectionView การปรับขนาดเซลล์ด้วยเค้าโครงอัตโนมัติ
ฉันกำลังพยายามปรับขนาดตัวเอง UICollectionViewCellsทำงานกับเค้าโครงอัตโนมัติ แต่ฉันไม่สามารถทำให้เซลล์ปรับขนาดตัวเองให้เข้ากับเนื้อหาได้ ฉันมีปัญหาในการทำความเข้าใจว่าขนาดของเซลล์มีการอัปเดตอย่างไรจากเนื้อหาของสิ่งที่อยู่ภายใน contentView ของเซลล์ นี่คือการตั้งค่าที่ฉันได้ลอง: กำหนดเองUICollectionViewCellด้วย a UITextViewใน contentView เลื่อนเพื่อที่UITextViewถูกปิดการใช้งาน ข้อ จำกัด ในแนวนอนของ contentView คือ: "H: | [_textView (320)]" กล่าวUITextViewคือถูกตรึงที่ด้านซ้ายของเซลล์ด้วยความกว้างที่ชัดเจน 320 ข้อ จำกัด ในแนวตั้งของ contentView คือ: "V: | -0 - [_ textView]" กล่าวคือUITextViewถูกตรึงไว้ที่ด้านบนของเซลล์ UITextViewมีชุดความสูงข้อ จำกัด ที่จะคงที่ซึ่งเป็นUITextViewรายงานที่จะพอดีกับข้อความ นี่คือสิ่งที่ดูเหมือนกับพื้นหลังของเซลล์ตั้งค่าเป็นสีแดงและUITextViewพื้นหลังตั้งค่าเป็นสีน้ำเงิน: ฉันใส่โครงการที่ผมได้เล่นกับบน GitHub ที่นี่

12
Autolayout - ขนาดที่แท้จริงของ UIButton ไม่รวมชื่อเรื่อง
หากฉันมีการจัดเรียง UIButton โดยใช้การชำระอัตโนมัติโดยอัตโนมัติขนาดของมันจะปรับให้เข้ากับเนื้อหาของมัน ถ้าฉันตั้งรูปภาพเป็นbutton.imageขนาด instrinsic อีกครั้งดูเหมือนว่าจะคำนึงถึงเรื่องนี้ อย่างไรก็ตามถ้าฉันปรับแต่งtitleEdgeInsetsปุ่มการจัดวางไม่ได้ทำเพื่อสิ่งนี้และจะตัดทอนชื่อปุ่มแทน ฉันจะมั่นใจได้อย่างไรว่าความกว้างที่แท้จริงของปุ่มนั้นเป็นสิ่งที่ใส่เข้าไป? แก้ไข: ฉันใช้สิ่งต่อไปนี้: [self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; เป้าหมายคือการเพิ่มการแยกระหว่างรูปภาพและข้อความ

8
iOS: UILabel หลายบรรทัดในเค้าโครงอัตโนมัติ
ฉันมีปัญหาในการพยายามที่จะบรรลุพฤติกรรมการจัดวางพื้นฐานบางอย่างกับเค้าโครงอัตโนมัติ ตัวควบคุมมุมมองของฉันมีลักษณะเช่นนี้ใน IB: ป้ายกำกับยอดนิยมคือป้ายกำกับชื่อฉันไม่ทราบว่าจะมีหลายบรรทัด ฉันต้องการป้ายชื่อเพื่อแสดงข้อความทุกบรรทัด ฉันยังต้องการป้ายกำกับอีกสองรายการและภาพขนาดเล็กที่จะวางไว้ด้านล่างชื่อเรื่อง แต่มันก็สูง ฉันได้ตั้งค่าข้อ จำกัด ระยะห่างแนวตั้งระหว่างป้ายกำกับและภาพขนาดเล็กรวมถึงข้อ จำกัด ระยะห่างสูงสุดระหว่างป้ายกำกับชื่อและกำกับดูแลและ จำกัด ระยะห่างด้านล่างระหว่างภาพขนาดเล็กและกำกับดูแล UIView สีขาวไม่มีข้อจำกัดความสูงดังนั้นควรยืดในแนวตั้งเพื่อเก็บภาพย่อย ฉันได้ตั้งค่าจำนวนบรรทัดสำหรับป้ายชื่อเรื่องเป็น 0 ฉันจะทำให้ป้ายชื่อปรับขนาดให้พอดีกับจำนวนบรรทัดที่สตริงต้องการได้อย่างไร ความเข้าใจของฉันคือฉันไม่สามารถใช้เมธอด setFrame ได้เพราะฉันใช้เลย์เอาต์อัตโนมัติ และฉันต้องใช้การจัดวางอัตโนมัติเพราะฉันต้องการมุมมองอื่น ๆ เหล่านั้นเพื่อให้อยู่ใต้ป้ายกำกับชื่อเรื่อง (ข้อ จำกัด ) ฉันจะทำให้สิ่งนี้เกิดขึ้นได้อย่างไร

18
ฉันจะใช้ Autolayout เพื่อกำหนดข้อ จำกัด ใน UIScrollview ของฉันได้อย่างไร
ฉันใช้เวลาสองวันในการลองวิธีแก้ปัญหาต่าง ๆ สำหรับวิธีผสมและ Pure Autolayoutเพื่อให้ได้สิ่งที่เป็นการตั้งค่า scrollview เล็กน้อยก่อนการ autolayout และตอนนี้เป็นทางการ - ฉันต้องโง่เกินไป ฉันกำลังตั้งค่านี้ส่วนใหญ่ใน Storyboard (ก็เป็นแบบที่มันเป็น) ดังนั้นนี่คือข้ออ้างของฉันเพื่อขอความช่วยเหลือ Viewtree: UIView -UIView -UIView ..-UIScrollview ...-UIButton ...-UIButton ...-UIButton ปุ่มควรเลื่อนในแนวนอน (ซ้ายไปขวาและกลับกัน) ใครช่วยกรุณาแจ้งให้เราทราบวิธีการตั้งข้อ จำกัด เพื่อให้บรรลุนี้โดยใช้ Autolayout บริสุทธิ์ ??? - ฉันได้ลองใช้วิธีผสมเช่น: UIView - UIView - UIView ..-UIScrollview ...-UIView (contentview) ....-UIButton ....-UIButton ....-UIButton ... และการตั้งค่าข้อ จำกัด ความกว้างและความสูงคงที่สำหรับcontentviewและการtranslatesAutoresizingMaskIntoConstraintsตั้งค่าตาม TechNote ของ …

4
NSInvalidUnarchiveOperationException: ไม่สามารถสร้างอินสแตนซ์ของคลาสที่ชื่อว่า NSLayoutConstraint
ฉันใหม่มากในการนี้. ฉันทำตามขั้นตอนการสอนของ Apple สำหรับโครงการ iPhone "HelloWorld" ฉันขับมันในเครื่องจำลอง iPhone 5.0 และมันพัง: 2012-11-02 14: 46: 06.782 HelloWorld [9880: c07] * แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSInvalidUnarchiveOperationException' เหตุผล: 'ไม่สามารถสร้างอินสแตนซ์ของคลาสชื่อ NSLayoutConstraint' * 0xea2d0a 0xea2d0a 0xea2d0a 0xea2d0a 0xea2d0a 0x32f6b7 0x23036d 0xd7e2c 0xd83a9 0xd85cb 0x38a73 0x38ce2 0x38ea8 0x3fd9a 0x10be6 0x118a6 0x20743 0x211f8 0x14aa9 0x138cfa9 0x14761c5 0x13db022 0x13d990a 0x13d8db4 0x13d8ccb 0x112a7 …

13
เลย์เอาต์อัตโนมัติด้วย UIViews ที่ซ่อนอยู่หรือไม่
ฉันรู้สึกว่ามันเป็นกระบวนทัศน์ที่ใช้กันทั่วไปในการแสดง / ซ่อนUIViewsบ่อยที่สุดUILabelsขึ้นอยู่กับตรรกะทางธุรกิจ คำถามของฉันคือวิธีที่ดีที่สุดในการใช้ AutoLayout เพื่อตอบสนองต่อมุมมองที่ซ่อนอยู่ราวกับว่าเฟรมเป็น 0x0 นี่คือตัวอย่างของรายการแบบไดนามิกของคุณสมบัติ 1-3 ตอนนี้ฉันมีพื้นที่บน 10px จากปุ่มไปยังป้ายกำกับสุดท้ายซึ่งแน่นอนจะไม่เลื่อนขึ้นเมื่อมีการซ่อนป้ายกำกับ ณ ตอนนี้ฉันได้สร้างทางออกให้กับข้อ จำกัด นี้และแก้ไขค่าคงที่ตามจำนวนป้ายที่ฉันกำลังแสดง เห็นได้ชัดว่านี่เป็นเรื่องเล็กน้อยเนื่องจากฉันใช้ค่าคงที่ติดลบเพื่อกดปุ่มขึ้นไปบนเฟรมที่ซ่อนอยู่ มันก็ไม่ดีเช่นกันเพราะมันไม่ได้ถูก จำกัด ด้วยองค์ประกอบเลย์เอาต์ที่แท้จริงเพียงแค่การคำนวณแบบคงที่ซึ่งไม่น่าเชื่อตามความสูง / การซ้อนขององค์ประกอบอื่น ๆ และการต่อสู้กับสิ่งที่ AutoLayout สร้างขึ้น เห็นได้ชัดว่าฉันสามารถสร้างข้อ จำกัด ใหม่ ๆ ได้ขึ้นอยู่กับป้ายกำกับแบบไดนามิกของฉัน แต่นั่นเป็นเรื่องเล็กมากและการใช้คำฟุ่มเฟือยมากสำหรับการพยายามที่จะยุบช่องว่างบางส่วน มีแนวทางที่ดีกว่านี้ไหม? การเปลี่ยนขนาดเฟรม 0,0 และให้ AutoLayout ทำสิ่งนั้นโดยไม่มีการควบคุมข้อ จำกัด ? กำลังลบมุมมองออกทั้งหมดหรือไม่ แม้ว่าโดยสุจริตเพียงแค่ปรับเปลี่ยนค่าคงที่จากบริบทของมุมมองที่ซ่อนอยู่ต้องใช้รหัสบรรทัดเดียวพร้อมการคำนวณอย่างง่าย สร้างข้อ จำกัด ใหม่ด้วย constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:ดูเหมือนจะหนักมาก แก้ไขกุมภาพันธ์ 2018 : คำตอบดูเบนกับUIStackViews

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

11
ฉันจะปรับจุดยึดของ CALayer ได้อย่างไรเมื่อใช้ Auto Layout?
หมายเหตุ : สิ่งต่าง ๆ ได้ดำเนินไปนับตั้งแต่มีการถามคำถามนี้ ดูที่นี่สำหรับภาพรวมที่ดีล่าสุด ก่อนเลย์เอาต์อัตโนมัติคุณสามารถเปลี่ยนจุดยึดของเลเยอร์ของมุมมองโดยไม่ย้ายมุมมองโดยจัดเก็บเฟรมตั้งค่าจุดยึดและกู้คืนเฟรม ในโลกเลย์เอาต์อัตโนมัติเราไม่ได้กำหนดเฟรมอีกต่อไป แต่ข้อ จำกัด ไม่ได้ขึ้นอยู่กับงานของการปรับตำแหน่งมุมมองกลับไปที่ที่เราต้องการ คุณสามารถแฮกข้อ จำกัด เพื่อเปลี่ยนตำแหน่งมุมมองของคุณ แต่เมื่อหมุนหรือเหตุการณ์การปรับขนาดอื่น ๆ สิ่งเหล่านี้จะไม่ถูกต้องอีกครั้ง แนวคิดที่สดใสต่อไปนี้ใช้ไม่ได้เนื่องจากสร้าง "การจับคู่แอตทริบิวต์ของรูปแบบไม่ถูกต้อง (ซ้ายและกว้าง)": layerView.layer.anchorPoint = CGPointMake(1.0, 0.5); // Some other size-related constraints here which all work fine... [self.view addConstraint: [NSLayoutConstraint constraintWithItem:layerView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:layerView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:20.0]]; ความตั้งใจของฉันที่นี่คือการตั้งค่าขอบด้านซ้ายของlayerViewมุมมองที่มีจุดยึดที่ปรับได้ถึงครึ่งหนึ่งของความกว้างของมันบวก 20 (ระยะทางที่ฉันต้องการแทรกจากขอบด้านซ้ายของผู้ควบคุม) เป็นไปได้ไหมที่จะเปลี่ยนจุดยึดโดยไม่ต้องเปลี่ยนตำแหน่งของมุมมองในมุมมองที่ถูกจัดวางด้วยเลย์เอาต์อัตโนมัติ? ฉันต้องใช้ค่าฮาร์ดโค้ดและแก้ไขข้อ จำกัด …
161 ios  calayer  autolayout 

14
การจัดมุมมองให้อยู่กึ่งกลางในมุมมองของมันโดยใช้ภาษารูปแบบภาพ
ฉันเพิ่งเริ่มเรียนรู้ AutoLayout สำหรับ iOS และดูภาษารูปแบบภาพ ทุกอย่างทำงานได้ดียกเว้นสิ่งหนึ่ง: ฉันไม่สามารถรับมุมมองไปยังศูนย์ภายในกำกับ เป็นไปได้ด้วย VFL หรือฉันจำเป็นต้องสร้างข้อ จำกัด ด้วยตนเอง?

6
การเปิดใช้งานเลย์เอาต์อัตโนมัติใน iOS 6 ในขณะที่เหลือถอยหลังเข้ากันได้กับ iOS 5
วิธีที่ดีที่สุดในการใช้ประโยชน์จากคุณลักษณะเลย์เอาต์อัตโนมัติใหม่ของ iOS 6 ในขณะที่ยังให้ความสามารถในการทำงานร่วมกับอุปกรณ์รุ่นเก่าบน iOS เวอร์ชันก่อนหน้านี้คืออะไร

13
UILabel sizeToFit ไม่ทำงานกับ autolayout ios6 โดยอัตโนมัติ
ฉันควรจะกำหนดค่าโปรแกรม (และวิธีใด) โดยทางโปรแกรม UILabel ซึ่งความสูงขึ้นอยู่กับข้อความ ฉันพยายามตั้งค่าโดยใช้ Storyboard และรหัสร่วมกัน แต่ก็ไม่มีประโยชน์ ทุกคนแนะนำsizeToFitขณะที่การตั้งและlineBreakMode numberOfLinesแต่ไม่ว่าถ้าฉันใส่รหัสที่ในviewDidLoad:, viewDidAppear:หรือviewDidLayoutSubviewsฉันไม่สามารถได้รับมันในการทำงาน ฉันอาจทำให้กล่องเล็กเกินไปสำหรับข้อความยาวและมันจะไม่เติบโตหรือฉันทำให้มันใหญ่เกินไปและจะไม่หดตัว
152 ios  ios6  uilabel  autolayout 

4
วิธีการปรับขนาด superview เพื่อให้พอดีกับการแสดงย่อยทั้งหมดด้วย autolayout
ความเข้าใจของฉันเกี่ยวกับการชำระอัตโนมัติคือการใช้ขนาดของการกำกับดูแลและยึดตามข้อ จำกัด และขนาดที่แท้จริงที่จะคำนวณตำแหน่งของการสัมภาษณ์ มีวิธีย้อนกลับกระบวนการนี้หรือไม่? ฉันต้องการปรับขนาด superview บนพื้นฐานของข้อ จำกัด และขนาดที่แท้จริง วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คืออะไร? ฉันได้ดูการออกแบบใน Xcode UITableViewซึ่งผมใช้เป็นส่วนหัวสำหรับ มุมมองนี้มีป้ายกำกับและปุ่ม ขนาดของฉลากจะแตกต่างกันไปตามข้อมูล ขึ้นอยู่กับข้อ จำกัด ของฉลากกดปุ่มลงได้สำเร็จหรือหากมีข้อ จำกัด ระหว่างปุ่มและด้านล่างของการกำกับดูแลฉลากจะถูกบีบอัด ฉันพบคำถามที่คล้ายกันสองสามข้อ แต่พวกเขาไม่มีคำตอบที่ดีและง่าย

20
reloadData () ของ UITableView พร้อมความสูงของเซลล์แบบไดนามิกทำให้เกิดการเลื่อนที่น่ากลัว
ฉันรู้สึกว่านี่อาจเป็นปัญหาทั่วไปและสงสัยว่ามีวิธีแก้ไขปัญหาร่วมกันหรือไม่ โดยพื้นฐานแล้ว UITableView ของฉันมีความสูงของเซลล์แบบไดนามิกสำหรับทุกเซลล์ หากฉันไม่ได้อยู่ที่ด้านบนของ UITableView และฉันการtableView.reloadData()เลื่อนขึ้นจะกลายเป็นสิ่งที่น่ากลัว ฉันเชื่อว่านี่เป็นเพราะความจริงที่ว่าเพราะฉันโหลดข้อมูลใหม่ขณะที่ฉันเลื่อนขึ้น UITableView กำลังคำนวณความสูงใหม่สำหรับแต่ละเซลล์ที่มองเห็นได้ ฉันจะลดขนาดนั้นได้อย่างไรหรือฉันจะโหลดเฉพาะข้อมูลจาก IndexPath ที่แน่นอนไปยังจุดสิ้นสุดของ UITableView ได้อย่างไร นอกจากนี้เมื่อฉันจัดการเพื่อเลื่อนไปด้านบนสุดฉันสามารถเลื่อนกลับลงมาและจากนั้นขึ้นไม่มีปัญหาโดยไม่มีการกระโดด สิ่งนี้มีโอกาสมากที่สุดเนื่องจากมีการคำนวณความสูงของ UITableViewCell แล้ว

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