NSLayoutConstraint คืออะไร“ UIView-Encapsulated-Layout-Height” และฉันควรบังคับให้มันคำนวณใหม่อย่างหมดจดอย่างไร


262

ฉันUITableViewทำงานภายใต้ iOS 8 และฉันใช้ความสูงของเซลล์อัตโนมัติจากข้อ จำกัด ในกระดานเรื่องราว

หนึ่งในเซลล์ของฉันมีเซลล์เดียวUITextViewและฉันต้องการให้สัญญาและขยายตามการป้อนข้อมูลของผู้ใช้ - แตะเพื่อย่อ / ขยายข้อความ

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

-(void)collapse:(BOOL)collapse; {

    _collapsed = collapse;

    if(collapse)
        [_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
    else
        [_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];

    [self setNeedsUpdateConstraints];

}

เมื่อใดก็ตามที่ฉันทำสิ่งนี้ฉันใส่ไว้ในtableViewอัพเดตและโทร[tableView setNeedsUpdateConstraints]:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView setNeedsUpdateConstraints];
// I have also tried 
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.

[tableView endUpdates];

เมื่อฉันทำสิ่งนี้เซลล์ของฉันจะขยาย (และเคลื่อนไหวในขณะที่ทำ) แต่ฉันได้รับคำเตือนข้อ จำกัด :

2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(

    "<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",

    "<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-|   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
 )

Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>

388 คือความสูงที่คำนวณได้ของฉัน, ข้อ จำกัด อื่น ๆ ของUITextViewคือจาก Xcode / IB

สิ่งสุดท้ายที่ทำให้ฉันรำคาญ - ฉันเดาว่าUIView-Encapsulated-Layout-Heightมันคือความสูงที่คำนวณได้ของเซลล์เมื่อมันแสดงผลครั้งแรก - (ฉันตั้งUITextViewความสูงของฉันเป็น> = 70.0) แต่ดูเหมือนว่ามันไม่ถูกต้อง อัปเดตผู้ใช้ cnstraint

ถึงแม้ว่ารหัสเลย์เอาต์บอกว่ามันพยายามที่จะทำลายข้อจำกัดความสูงของฉัน แต่ก็ไม่ได้ - มันจะทำการคำนวณความสูงของเซลล์อีกครั้งและทุกอย่างก็ดึงตามที่ฉันต้องการ

ดังนั้นคืออะไรNSLayoutConstraint UIView-Encapsulated-Layout-Height(ฉันเดาว่ามันคือความสูงที่คำนวณได้สำหรับการปรับขนาดเซลล์อัตโนมัติ) และฉันจะบังคับให้คำนวณใหม่อย่างสมบูรณ์ได้อย่างไร


3
ข้ามโพสต์ไปยังฟอรัม Apple dev: devforums.apple.com/thread/238803
Rog

3
ฉันแก้ไขปัญหาที่คล้ายกันในวิธีต่อไปนี้และทำงานบน iOS 7/8 1) หนึ่งในความสำคัญต่ำกว่าข้อ จำกัด ในการ 750 ผมจะพยายามที่ 1 หรือที่ 2 2) ในประเภทรองเซลล์ใน awakeFromNib self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;ชุด ฉันคิดว่าในตอนแรกการตั้งค่ารูปแบบการเติมอัตโนมัติจะหยุดข้อ จำกัด สุดท้ายจากการเพิ่ม ฉันพบวิธีแก้ปัญหานี้ที่นี่: github.com/wordpress-mobile/WordPress-iOS/commit/…
Jesse

3
@RogerNolan ข่าวอะไร? ฉันพบปัญหาเดียวกันขณะเล่นกับโครงร่างอัตโนมัติในตัวสร้างส่วนต่อประสาน เซลล์บางแห่งทำให้เกิดปัญหานี้บางส่วนไม่ได้
orkenstein

3
ฉันไม่คิดว่าการเพิ่มเครื่องหมายการเพิ่มขนาดอัตโนมัติเป็นทางออกที่ดี
Rog

1
@RogerNolan คุณสร้างเซลล์นี้ใน IB ก่อนทำการเปลี่ยนแปลงเค้าโครงหรือไม่ ฉันได้แก้จุดบกพร่องของปัญหาเดียวกัน แต่ฉันไม่ได้เพิ่มข้อ จำกัด พิเศษใด ๆ ฉันจัดการที่จะระงับการเตือนโดยการสร้างมุมมองใหม่ตั้งแต่เริ่มต้นและเมื่อฉันกระจายไฟล์สตอรี่บอร์ด 2 ไฟล์ความแตกต่างเพียงอย่างเดียวคือเวอร์ชันที่มีคำเตือนหายไปตาม<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>คำจำกัดความทำให้ฉันเชื่อว่านี่เป็นข้อผิดพลาดของ IB . อย่างน้อยฉันก็อยู่แล้ว
Ell Neal

คำตอบ:


301

พยายามลดระดับความสำคัญของคุณ_collapsedtextHeightConstraintเหลือ 999 วิธีนี้UIView-Encapsulated-Layout-Heightข้อ จำกัดที่ระบบกำหนดไว้จะมีความสำคัญกว่าเสมอ

-tableView:heightForRowAtIndexPath:มันขึ้นอยู่กับสิ่งที่คุณกลับมาใน ตรวจสอบให้แน่ใจว่าได้คืนค่าที่ถูกต้องและข้อ จำกัด ของคุณเองและค่าที่สร้างขึ้นควรเหมือนกัน ลำดับความสำคัญที่ต่ำกว่าสำหรับข้อ จำกัด ของคุณเป็นสิ่งจำเป็นเพียงชั่วคราวเพื่อป้องกันความขัดแย้งในขณะที่การยุบ / ขยายภาพเคลื่อนไหวกำลังขึ้นเครื่องบิน


74
นั่นจะประสบความสำเร็จตรงข้ามกับสิ่งที่ฉันต้องการ UIView-Encapsulated-Layout-Height ไม่ถูกต้อง - เป็นของเค้าโครงก่อนหน้า
Rog

7
UIView-Encapsulated-Layout-Heightจำกัด ถูกเพิ่มโดย UITableView ครั้งเดียวสูงจะถูกกำหนด ฉันคำนวณความสูงตามเนื้อหาsystemLayoutSizeFittingSizeของ contentView ที่นี่UIView-Encapsulated-Layout-Heightไม่สำคัญ จากนั้น tableView ชุด contentSize heightForRowAtIndexPath:อย่างชัดเจนค่าส่งกลับโดย ในกรณีนี้มันถูกต้องเพื่อลดความสำคัญของข้อ จำกัด ที่กำหนดเองของเราเนื่องจากข้อ จำกัด ของ tableView จะต้องมาก่อนหลังจากคำนวณความสูงของแถว
Ortwin Gentz

8
@OrtwinGentz: ยังไม่ได้รับคะแนนที่ถูกต้องเพื่อลดความสำคัญของข้อ จำกัด ที่กำหนดเองของเราเพราะข้อ จำกัด ของ tableView จะต้องมีความสำคัญกว่าหลังจากคำนวณ rowHeightsแล้ว สิ่งนี้เป็นสิ่งที่UIView-Encapsulated-Layout-Heightผิดถ้าฉันไม่ลดความสำคัญลง ...
ทดสอบ

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

9
-1 สำหรับคำตอบนี้เนื่องจากถือว่าข้อ จำกัด ที่เพิ่มเข้ามานั้นถูกต้อง การเพิ่มUIView-Encapsulated-Layout-Widthในกรณีของฉันเป็นเพียงผิด แต่ดูเหมือนว่าจะเป็นที่ต้องการมากกว่าข้อ จำกัด ที่ชัดเจนของฉันที่รันไทม์
เรย์

68

ฉันมีสถานการณ์ที่คล้ายกัน: มุมมองตารางที่มีเซลล์หนึ่งแถวซึ่งมีวัตถุ UILabel ไม่กี่บรรทัด ฉันใช้ iOS 8 และการชำระอัตโนมัติ

เมื่อฉันหมุนฉันพบว่าระบบคำนวณความสูงของแถวผิด (43.5 น้อยกว่าความสูงจริงมาก) ดูเหมือนว่า:

"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"

มันไม่ใช่แค่คำเตือน เค้าโครงของเซลล์มุมมองตารางของฉันแย่มาก - ข้อความทั้งหมดซ้อนทับกันในบรรทัดข้อความเดียว

มันทำให้ฉันประหลาดใจที่บรรทัดต่อไปนี้ "แก้ไข" ปัญหาของฉันอย่างน่าอัศจรรย์ (การชำระอัตโนมัติไม่มีอะไรบ่นและฉันได้รับสิ่งที่ฉันคาดหวังบนหน้าจอ):

myTableView.estimatedRowHeight = 2.0; // any number but 2.0 is the smallest one that works

มีหรือไม่มีบรรทัดนี้:

myTableView.rowHeight = UITableViewAutomaticDimension; // by itself this line only doesn't help fix my specific problem

8
ที่สุด! นี่คือคำตอบที่ถูกต้อง ในเซสชัน WWDC มีการกล่าวถึงถ้าคุณจะใช้การปรับขนาดความสูงของแถวอัตโนมัติคุณจะต้องตั้งค่าความสูงต่ำหรือสิ่งเลวร้ายที่เกิดขึ้นโดยประมาณ (ใช่สิ่งที่น่ารังเกียจเกิดขึ้นจริง ๆ กับ Apple)
Abdalrahman Shatou

50
FWIW การเพิ่มการประมาณการไม่ได้ทำให้ฉันแตกต่าง
Benjohn

3
หึ ฉันกลับมาที่คำตอบเดียวกันนี้อีกครั้งและไปใช้ด้วยความสุขและความหวัง อีกครั้งมันไม่ได้สร้างความแตกต่างให้กับฉัน :-)
Benjohn

3
การประมาณการที่ส่งคืนโดย tableView: โดยประมาณสูงที่สุด ForRowAtIndexPath: อย่างน้อยต้องใหญ่เท่ากับเซลล์ มิฉะนั้นความสูงที่คำนวณได้ของตารางจะน้อยกว่าความสูงจริงและตารางอาจเลื่อนขึ้น (เช่นหลังจากคลายการทำซ้ำกลับไปที่ตาราง) ไม่ควรใช้ UITableViewAutomaticDimension
แมตต์

1
โปรดทราบว่ายิ่งต่ำestimatedRowHeightยิ่งcellForRowAtIndexPathถูกเรียกมากในตอนแรก ความสูงของมุมมองตารางหารด้วยประมาณความสูงครั้งเป็นที่แน่นอน สำหรับ iPad Pro ขนาด 12 นิ้วอาจมีจำนวนเป็นพันและจะเป็นแหล่งข้อมูลและอาจทำให้เกิดการล่าช้าอย่างมาก
Mojo66

32

ฉันสามารถรับคำเตือนให้หายไปได้โดยระบุลำดับความสำคัญของค่าใดค่าหนึ่งในข้อ จำกัด ข้อความเตือนว่าจะต้องหยุด (ด้านล่าง"Will attempt to recover by breaking constraint") ปรากฏว่าตราบใดที่ฉันตั้งความสำคัญเป็นสิ่งที่มากกว่า49คำเตือนจะหายไป

สำหรับฉันนี่หมายถึงการเปลี่ยนข้อ จำกัด ของฉันคำเตือนบอกว่ามันพยายามที่จะทำลาย:

@"V:|[contentLabel]-[quoteeLabel]|"

ถึง:

@"V:|-0@500-[contentLabel]-[quoteeLabel]|"

ในความเป็นจริงฉันสามารถเพิ่มลำดับความสำคัญให้กับองค์ประกอบใด ๆ ของข้อ จำกัด นั้นและมันจะใช้ได้ ดูเหมือนว่าจะไม่สำคัญ เซลล์ของฉันมีความสูงที่เหมาะสมและคำเตือนไม่ปรากฏขึ้น Roger สำหรับตัวอย่างของคุณลองเพิ่ม@500หลังจาก388ข้อ จำกัด ค่าความสูง (เช่น388@500)

ฉันไม่แน่ใจว่าทำไมสิ่งนี้ถึงได้ผล ในenum NSLayoutPriorityก็ปรากฏว่าระดับความสำคัญคือNSLayoutPriorityFittingSizeCompression 50เอกสารสำหรับระดับความสำคัญนั้นบอกว่า:

เมื่อคุณส่งข้อความ fittingSize ไปยังมุมมองขนาดที่เล็กที่สุดที่ใหญ่พอสำหรับการคำนวณเนื้อหาของมุมมอง นี่คือระดับความสำคัญที่มุมมองต้องการมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ในการคำนวณนั้น มันค่อนข้างต่ำ โดยทั่วไปจะไม่เหมาะสมที่จะสร้างข้อ จำกัด ในลำดับความสำคัญนี้ คุณต้องการที่จะสูงหรือต่ำกว่า

เอกสารสำหรับการอ้างอิงfittingSizeข้อความอ่าน:

ขนาดต่ำสุดของมุมมองที่สอดคล้องกับข้อ จำกัด (อ่านเท่านั้น)

AppKit ตั้งค่าคุณสมบัตินี้ให้มีขนาดที่ดีที่สุดสำหรับมุมมองโดยพิจารณาจากข้อ จำกัด ทั้งหมดและมุมมองย่อยที่เก็บไว้และตอบสนองต่อความต้องการที่จะทำให้มุมมองมีขนาดเล็กที่สุดเท่าที่จะทำได้ ค่าขนาดในคุณสมบัตินี้จะไม่ติดลบ

ฉันไม่ได้ขุดไปกว่านั้น แต่ดูเหมือนจะสมเหตุสมผลว่าเรื่องนี้เกี่ยวข้องกับปัญหาที่เกิดขึ้น


นั่นคือเจฟ ยังรู้สึกเหมือนเป็นข้อบกพร่องสำหรับฉัน Apple ยังไม่ตอบสนองต่อ rdar แม้ว่า :-(
Rog

13

99.9% ของเวลาในขณะที่ใช้เซลล์หรือส่วนหัวที่กำหนดเองความขัดแย้งทั้งหมดจะUITableViewsเกิดขึ้นเมื่อตารางโหลดในครั้งแรก เมื่อโหลดแล้วคุณจะไม่เห็นความขัดแย้งอีกครั้ง

สิ่งนี้เกิดขึ้นเพราะนักพัฒนาส่วนใหญ่มักใช้ความสูงคงที่หรือข้อ จำกัด จุดยึดของบางประเภทเพื่อจัดวางองค์ประกอบในเซลล์ / ส่วนหัว ความขัดแย้งเกิดขึ้นเพราะเมื่อUITableViewการวาง / โหลดครั้งแรกมันตั้งค่าความสูงของเซลล์เป็น 0 ซึ่งเห็นได้ชัดว่าขัดแย้งกับข้อ จำกัด ของคุณเอง ในการแก้ปัญหานี้เพียงกำหนดข้อ จำกัด ความสูงคงที่ให้มีลำดับความสำคัญต่ำกว่า ( .defaultHigh) อ่านข้อความคอนโซลอย่างถี่ถ้วนและดูว่าข้อ จำกัด ใดที่ระบบโครงร่างตัดสินใจพัง โดยปกติแล้วนี่คือสิ่งที่ต้องเปลี่ยนลำดับความสำคัญ คุณสามารถเปลี่ยนลำดับความสำคัญดังนี้:

let companyNameTopConstraint = companyNameLabel.topAnchor.constraint(equalTo: companyImageView.bottomAnchor, constant: 15)
    companyNameTopConstraint.priority = .defaultHigh

NSLayoutConstraint.activate([
            companyNameTopConstraint,
           the rest of your constraints here
            ])

1
คำอธิบายที่สวยงาม
เกล็น

12

ผมสามารถที่จะแก้ไขข้อผิดพลาดนี้โดยการลบปลอมcell.layoutIfNeeded()ที่ฉันมีในของฉันtableView's cellForRowAtวิธี


1
ใช่สิ่งนี้แก้ไขปัญหาสำหรับฉันด้วย ฉันกำลังทำโครงร่างโค้ดดังนั้นในตอนแรกฉันคิดว่าฉันอาจพลาดอะไรบางอย่าง ขอบคุณ
John

1
สิ่งเดียวกัน! ขอบคุณ!
Andrey Chernukha

7

แทนที่จะแจ้งมุมมองตารางเพื่อปรับปรุงข้อ จำกัด ลองโหลดเซลล์ใหม่:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView reloadRowsAtIndexPaths:@[[tableView indexPathForCell:_briefCell]] withRowAnimation:UITableViewRowAnimationNone];

[tableView endUpdates];

UIView-Encapsulated-Layout-Height น่าจะเป็นความสูงของมุมมองตารางที่คำนวณได้สำหรับเซลล์ในระหว่างการโหลดเริ่มต้นขึ้นอยู่กับข้อ จำกัด ของเซลล์ในเวลานั้น


ฉันควรระบุไว้ในคำถามของฉันฉันได้ลองแล้ว แต่มันก็ใช้ไม่ได้ ฉันเห็นด้วยกับการเดาของคุณเกี่ยวกับ UIView-Encapsulated-Layout-Height
Rog

6
มีความโปรดปรานอยู่แล้วอย่างน้อยก็ส่งคำตอบ ดูเหมือนว่า SO จะปล่อยให้มันระเหยไปอย่างอื่น
Rog

6

ความเป็นไปได้อื่น:

หากคุณใช้เลย์เอาต์อัตโนมัติเพื่อคำนวณความสูงของเซลล์ (ความสูงของ contentView เวลาส่วนใหญ่ด้านล่าง) และหากคุณมีตัวคั่น uitableview คุณต้องเพิ่มความสูงของตัวคั่นเพื่อกลับไปที่ความสูงของเซลล์ เมื่อคุณได้ความสูงที่ถูกต้องคุณจะไม่ได้รับคำเตือนอัตโนมัติ

- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
   [sizingCell setNeedsLayout];
   [sizingCell layoutIfNeeded];
   CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
   return size.height; // should + 1 here if my uitableviewseparatorstyle is not none

}

นั่นช่วยฉันในกรณีที่ฉันมีความคลุมเครือของความสูงของเลย์เอาต์ในเลย์เอาต์ของเซลล์ที่ค่อนข้างซับซ้อนในบางตัวจำลอง (iPad 6 Plus) สำหรับฉันแล้วดูเหมือนว่าเนื่องจากข้อผิดพลาดในการปัดเศษภายในเนื้อหาจะบีบเล็กน้อยและหากข้อ จำกัด ไม่พร้อมที่จะถูกบีบเกินกว่าที่ฉันจะคลุมเครือ ดังนั้นแทนที่จะกลับมาUITableViewAutomaticDimensionในheightForRowAtIndexPathฉันกลับ [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] + 0.1
สิงห์

ฉันหมายถึงแน่นอน[sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 0.1
Leo

ตุปัดตุเป๋; การลบตัวคั่นเป็นสิ่งที่ตารางของฉันมีพฤติกรรมดังนั้นขอบคุณ
royalmurder

5

ดังที่เจสซี่พูดถึงในความคิดเห็นของคำถามสิ่งนี้ใช้ได้กับฉัน:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

FYI ปัญหานี้ไม่เกิดขึ้นใน iOS 10


2
ใน Swift 4.2: self.contentView.autoresizingMask = [.flexibleHeight]
airowe

4

ฉันมีข้อผิดพลาดนี้เมื่อใช้ UITableViewAutomaticDimension และเปลี่ยนข้อ จำกัด ของความสูงในมุมมองภายในเซลล์

ในที่สุดฉันก็พบว่ามันเป็นเพราะค่าคงที่ข้อ จำกัด ไม่ถูกปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด

let neededHeight = width / ratio // This is a CGFloat like 133.2353
constraintPictureHeight.constant = neededHeight // Causes constraint error
constraintPictureHeight.constant = ceil(neededHeight) // All good!

2
นี่คือความคิดเห็นที่ทำให้ฉันเป็นปัญหาของฉัน ฉันมีเซลล์รูปภาพที่โหลดแบบไดนามิก (ขยายและย่อขนาด) และมุมมอง tableview โดยประมาณRowHeight = 50 และ rowHeight = UITableViewAutomaticDimension ฉันยังคงฝ่าฝืนข้อ จำกัด แม้ว่าความเห็นบนโต๊ะอาหารเป็นความสูงที่ถูกต้อง กลับกลายเป็นว่าตัวแยกมีความสูง 0.3333 และนั่นคือสิ่งที่ทำให้ข้อ จำกัด ขนาดภาพของฉันในมือถือแตก หลังจากปิดตัวคั่นทั้งหมดก็ดี ขอบคุณ Che ที่ให้สิ่งที่ฉันมองหา
migs647

1
ในกรณีนี้สร้างข้อ จำกัด เพิ่มเติมเช่น bottomMargin> = view.bottomMargin+1@900 AutoLayout พยายามเพิ่มจุดพิเศษ 1 จุดปรับขนาดเซลล์สับสนเนื่องจากความสูงของตัวคั่นพยายามแบ่ง / ผ่อนคลายข้อ จำกัด ค้นหา @ 900 หนึ่งตัวและละทิ้งสิ่งนั้น คุณได้รับเลย์เอาท์ที่คุณต้องการโดยไม่มีคำเตือน
Anton

บันทึกวันของฉัน ไม่กี่ชั่วโมงต่อไป
Anton Tropashko

1

การปรับขนาดมุมมองข้อความให้พอดีกับเนื้อหาและการปรับปรุงค่าคงที่ข้อจำกัดความสูงเป็นความสูงที่เกิดขึ้นแก้ไขUIView-Encapsulated-Layout-Heightข้อ จำกัด ของความขัดแย้งสำหรับฉันเช่น:

[self.textView sizeToFit];
self.textViewHeightConstraint.constant = self.textView.frame.size.height;

คุณทำสิ่งนี้ที่ไหน ในเค้าโครงแสดงตัวอย่างไหม
stickj

1

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

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

เมื่อใดก็ตามที่เซลล์มีข้อมูลในการคำนวณขนาดของมัน ฉันคิดว่ามันสามารถเป็น

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

สิ่งที่ต้องการ

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; cell.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

หวังว่านี่จะช่วยได้!


0

TableView รับความสูงสำหรับเซลล์ที่ indexPath จากตัวแทน จากนั้นรับเซลล์จากcellForRowAtIndexPath:

top (10@1000)
    cell
bottom (0@1000)

ถ้า cell.contentView.height: 0 // <-> (UIView-Encapsulated-Layout-Height: 0 @ 1000) ด้านบน (10 @ 1000) ขัดแย้งกับ (UIView-Encapsulated-Layout-Height: 0 @ 1000)

เนื่องจากความสำคัญของพวกเขามีค่าเท่ากับ 1,000 เราต้องกำหนดลำดับความสำคัญสูงสุดภายใต้UIView-Encapsulated-Layout-Heightลำดับความสำคัญของ


0

ฉันได้รับข้อความเช่นนี้:

ไม่สามารถที่จะตอบสนองความพร้อมกัน จำกัด ...
...
...
...
NSLayoutConstraint: 0x7fe74bdf7e50 'UIView ห่อหุ้ม-Layout-สูง' V: [UITableViewCellContentView: 0x7fe75330c5c0 (21.5)]
...
...
จะพยายามที่จะกู้คืนโดย ข้อ จำกัด ที่ทำลาย NSLayoutConstraint: 0x7fe0f9b200c0 UITableViewCellContentView: 0x7fe0f9b1e090.bottomMargin == UILabel: 0x7fe0f9b1e970.bottom

ฉันใช้กำหนดเองUITableViewCellที่มีUITableViewAutomaticDimensionความสูง และฉันก็ใช้estimatedHeightForRowAtIndex:วิธีนี้เช่นกัน

ข้อ จำกัด ที่ทำให้ฉันมีปัญหาดูเหมือนนี้

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[title]-|" options:0 metrics:nil views:views];

การเปลี่ยนข้อ จำกัด เป็นการแก้ไขปัญหา แต่เหมือนคำตอบอื่นฉันรู้สึกว่ามันไม่ถูกต้องเนื่องจากมันลดระดับความสำคัญของข้อ จำกัด ที่ฉันต้องการ:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6@999-[title]-6@999-|" options:0 metrics:nil views:views];

อย่างไรก็ตามสิ่งที่ฉันสังเกตเห็นคือว่าถ้าฉันเพิ่งลบลำดับความสำคัญนี้ไปใช้งานได้และฉันไม่ได้รับบันทึกข้อ จำกัด :

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6-[title]-6-|" options:0 metrics:nil views:views];

นี้เป็นบิตของความลึกลับเป็นสิ่งที่แตกต่างระหว่างและ|-6-[title]-6-| |-[title-|แต่การระบุขนาดไม่ใช่ปัญหาสำหรับฉันและเป็นการกำจัดบันทึกและฉันไม่จำเป็นต้องลดระดับความสำคัญของข้อ จำกัด ตามที่ต้องการ


0

ตั้งค่านี้view.translatesAutoresizingMaskIntoConstraints = NO;ควรแก้ไขปัญหานี้


สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันแม้ว่ามันจะไม่ใช่โซลูชันที่สมบูรณ์
Enkha

0

ฉันมีปัญหาคล้ายกันกับเซลล์มุมมองคอลเล็กชัน

ฉันแก้ไขได้โดยลดระดับความสำคัญของข้อ จำกัด สุดท้ายที่เชื่อมโยงกับด้านล่างของเซลล์ (อันสุดท้ายในสายโซ่จากด้านบนไปด้านล่างของมุมมอง - นี่คือสิ่งที่กำหนดความสูงในท้ายที่สุด) ถึง 999

ความสูงของเซลล์ถูกต้องและคำเตือนหายไป

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