iOS8 - ข้อ จำกัด แนะนำความสูงเป็นศูนย์อย่างคลุมเครือ


100

มีใครคิดวิธีแก้จุดบกพร่องนี้บ้าง

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

แถวมีความสูงคงที่ตามที่กำหนด

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}

และconstraintsดูเหมือนจะมีความสุข ...

คำตอบ:


129

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

- (CGFloat)tableView:(UITableView *)tableView 
           estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

อีกวิธีหนึ่งที่คุณไม่ต้องการการลบล้างทั้งสองก็คือใช้self.tableView.rowHeight = 44;ในloadViewวิธีการของคุณหรือเริ่มต้น


1
ฉันมีหลายประเภทแถวในส่วนและมีเพียงแถวเดียวเท่านั้นที่มีความสูงแบบไดนามิก แล้วมันไม่ทำงาน
Raj Aggrawal

หากเราตั้งค่าความสูงเริ่มต้นใน xib / storyboard เราไม่จำเป็นต้องใช้วิธีการเหล่านี้
Satyam

77

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


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

7
นั่นเป็นคำตอบที่ถูกต้องสำหรับ iOS 8 เมื่อใช้เซลล์มุมมองตารางปรับขนาดตนเอง
tsafrir

1
คุณหมายถึงข้อ จำกัด จากองค์ประกอบภายในมุมมองเนื้อหาที่ด้านบนและด้านล่างของมุมมองเนื้อหาหรือไม่
Zack Shapiro

ฉันพยายามแล้ว แต่ได้รับคำเตือนข้อ จำกัด ที่ขัดแย้งกันอยู่เรื่อย ๆ
Shirish Kumar

2
ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มข้อ จำกัด ด้านบนและด้านล่างลงในมุมมองเนื้อหาของเซลล์ไม่ใช่ตัวเซลล์ หากคุณเพิ่มข้อ จำกัด ในเซลล์โค้ดจะยังคงใช้งานได้ แต่จะพยายามใช้ความสูงเป็น 0
ตั้งแต่

26

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

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

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

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

หากคุณไม่เคยใช้เมธอด 'heightForRowAtIndexPath' มาก่อน แต่ต้องการดีบักข้อผิดพลาดนี้โดยไม่ต้องยกเลิกการตั้งค่า UITableViewAutomaticDimension ของคุณเพียงเพิ่มสิ่งนี้ลงในโค้ดของคุณ:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

ขอบคุณมาก. สิ่งนี้ช่วยฉันได้มาก ตอนแรกฉันคิดว่าปัญหานั้นเกิดจากเซลล์มุมมองตารางอื่น หลังจากแก้ไขข้อบกพร่องแล้วปัญหานั้นเกิดขึ้นกับอีกปัญหาหนึ่ง
akozin

ฉันต้องการทำสิ่งนี้ แต่ส่วนและแถวยาวไม่สามารถระบุได้ คุณช่วยชี้แจงสิ่งเหล่านี้ใน Swift ได้หรือไม่?
DrWhat

9

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


2
หากคุณใช้เซลล์ปรับขนาดเองคุณต้องปล่อยให้ความสูงของแถวตั้งเป็น "ค่าเริ่มต้น"
phatmann

1
สิ่งนี้แก้ไขคำเตือน แต่ฉันเชื่อว่ามันจะปรากฏเฉพาะเมื่อใช้ Static Cells ใน TableView
MontiRabbit

1
@phatmann ปัญหานี้จะปรากฏเฉพาะสำหรับเซลล์คงที่ดังนั้นเซลล์จึงไม่ควรปรับขนาดเอง
ltm

@ltm เซลล์ที่ปรับขนาดได้เองอาจไม่มีประโยชน์ในเซลล์แบบคงที่ถ้าผู้ใช้ขยายข้อความอาจจะ? (คุณก็รู้ภายใต้การเข้าถึงในการตั้งค่า iPhone)
Byron Coetsee

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

3

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


3

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

เค้าโครงที่มีความสุขสำหรับความสูงของแถวอัตโนมัติหมายความว่านอกเหนือจากข้างต้นแล้วคุณยังรวมข้อ จำกัด ที่ด้านล่างของเซลล์ด้วย

เพิ่มเติมที่นี่: ตรวจพบกรณีที่ข้อ จำกัด ชี้ให้เห็นความสูงเป็นศูนย์อย่างคลุมเครือ


3

ฉันใช้ Row Height 43 (หรือ <> 44) ในตัวตรวจสอบขนาด Table View และข้อผิดพลาดก็หายไป ใช้ 44 ฉันได้รับข้อผิดพลาด Xcode เวอร์ชัน 6.0.1

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


2

ฉันไม่สามารถลบคำเตือนได้ แต่เพื่อให้ข้อ จำกัด ทำงานได้ฉันตั้งค่าคุณสมบัติใหม่เป็น iOS8, tableview estimatedRowHeightเป็นความสูงคงที่และนำheightForRowAtIndexPathการใช้งานออก


หากไม่ได้ลบคำเตือนออกไปกว่าระบบจะสร้างข้อ จำกัด ที่ขาดหายไปและตั้งค่าความสูงของแถว == ให้กับคุณสมบัติ cell.rowHeight คำเตือนเกี่ยวกับคุณสมบัติการรักษาอัตโนมัติถ้ามันหายอัตโนมัตินั่นหมายความว่าไม่มีปัญหา?
Pedro Borges

2

หากคุณได้รับคำเตือนนั้นเป็นไปได้มากว่าคุณกำลังใช้การจัดวางอัตโนมัติและเซลล์ของคุณไม่มีข้อ จำกัด ใด ๆ อยู่ภายใน

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

คุณสามารถปิดการจัดวางอัตโนมัติในตัวสร้างอินเทอร์เฟซได้โดยยกเลิกการเลือกตัวเลือก "ใช้การจัดวางอัตโนมัติ" ในตัวตรวจสอบไฟล์ทางด้านขวา

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

ข้อ จำกัด ในแนวตั้ง

  1. ข้อ จำกัด ของพื้นที่แนวตั้งระหว่างด้านบนของมุมมองเนื้อหาและด้านบนของป้ายกำกับ
  2. ความสูงคงที่ของป้ายกำกับ
  3. ข้อ จำกัด ของพื้นที่แนวตั้งระหว่างด้านล่างของป้ายกำกับและด้านล่างของมุมมองเนื้อหา

ข้อ จำกัด ในแนวนอน

  1. ข้อ จำกัด ของพื้นที่แนวนอนระหว่างขอบนำหน้าของมุมมองเนื้อหาและขอบด้านบนของป้ายกำกับ
  2. ความกว้างคงที่ของฉลาก
  3. การ จำกัด ช่องว่างแนวนอนระหว่างขอบด้านหลังของป้ายกำกับและขอบด้านท้ายของมุมมองเนื้อหา

ฉันใช้ข้อ จำกัด และดูเหมือนว่าทุกคนจะมีความสุขตามที่กล่าวไว้ในคำถาม
คริส

ข้อ จำกัด เหล่านั้นสำหรับมุมมองย่อยของมุมมองเนื้อหาของเซลล์หรือไม่ หน้าตาเป็นอย่างไร เป็นไปได้ไหมที่คุณมีเซลล์บางเซลล์ที่แตกต่างกัน? หากคุณกำลังกำหนดให้เซลล์มีความสูงคงที่โดยใช้โซลูชันของ Frederic Bonner ข้อ จำกัด จะถูกลบล้าง
wrightak

1

คุณสามารถใช้เค้าโครงอัตโนมัติเพื่อคำนวณความสูงที่เหมาะสมสำหรับคุณ นี่คือโพสต์ที่ดีเกี่ยวกับ Dynamic Cell Height บน iOS 8: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/


ฉันหวังว่ามันจะง่ายขนาดนี้ การเพิ่มสองบรรทัดนี้ไม่ได้ช่วยแก้ปัญหาการปรับขนาดอัตโนมัติของฉัน
Zack Shapiro

1

ในSwiftบังคับให้ความสูงกลับแก้ไขปัญหาของฉัน:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 44;
}

ในตัวควบคุมมุมมองตารางของคุณ


1

ฉันใช้ mapView ใน uitableviewcell ฉันเปลี่ยนความสูงของมุมมองแผนที่เป็น 1/3 ของขนาดหน้าจออุปกรณ์ ฉันได้รับข้อผิดพลาดเดียวกัน ฉันแก้ไขข้อผิดพลาดโดยเพิ่มข้อ จำกัด ที่ขาดหายไปในมุมมองเนื้อหาของ uitableviewcell

1) ล้างข้อ จำกัด contentView

2) ตั้งค่ารีเซ็ตเป็นค่าคงที่แนะนำเป็น contentView

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

3) เพิ่มข้อ จำกัด ที่ขาดหายไป - ถ้ามี

4) เราตรวจสอบให้แน่ใจว่ามุมมองเนื้อหามีข้อ จำกัด ที่จำเป็นทั้งหมด ป้อนคำอธิบายภาพที่นี่


0

ในกรณีของฉันมันเป็นเพราะฉันกำลังออกแบบเซลล์ด้วย xib และฉันลืมเพิ่มไฟล์ xib นั้นไปยังเป้าหมาย

หลังจากที่ฉันเพิ่มไฟล์ xib นั้นไปยังเป้าหมายปัญหาจะหมดไป


0

แม้ว่าคำตอบในหน้านี้จะกล่าวถึงการเพิ่มข้อ จำกัด ด้านความสูงหรือการส่งคืน rowHeights ด้วยตนเองเช่นความสูง 44 สำหรับความสูงForRowAtIndexPathทำให้คำเตือนหายไป แต่ก็ไม่จำเป็นเนื่องจากเป็นข้อบกพร่องใน Xcode ที่มองเห็นได้ในเวอร์ชัน 6.3.2 (6D2105) เป็นอย่างน้อย

หากคุณตั้งค่าเบรกพอยต์ใน viewDidLoad คุณจะเห็น self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) แม้ว่าคุณจะระบุความสูงของแถวที่ 44 ในกระดานเรื่องราว เนื่องจาก Apple สันนิษฐานอย่างไม่ถูกต้องว่าคุณต้องการความสูงของแถวแบบไดนามิกหากคุณปล่อยให้ความสูงของแถวอยู่ที่ 44 เนื่องจากไม่ได้ระบุค่าสถานะให้คุณระบุความต้องการของคุณ

วิธีแก้ปัญหาที่เป็นไปได้และผลลัพธ์มีดังนี้

  • ตั้งค่าความสูงของแถวเป็น 43 หรือ 45 ในสตอรีบอร์ด (ทำงาน)

  • ส่งคืนความสูง 44 ด้วยตนเอง heightForRowAtIndexPath (ทำงาน)

  • เพิ่มข้อ จำกัด ด้านความสูงระหว่างองค์ประกอบของ UITableViewCell และ contentView (ทำงาน)

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

  • ตั้งค่าความสูงของแต่ละ UITableViewCell เป็น 44 (กำหนดเอง) ในกระดานเรื่องราว (ล้มเหลว)

ฉันต้องการโซลูชันสตอรีบอร์ดที่แท้จริงสำหรับสิ่งนี้ในที่สุดฉันก็ลอง:

  • เพิ่มแอ็ตทริบิวต์รันไทม์ที่ผู้ใช้กำหนดให้กับ UITableView ในสตอรีบอร์ดและตั้งชื่อ UITableView พร้อมหมายเหตุเกี่ยวกับวิธีการตั้งค่า rowHeight เพื่อให้นักพัฒนาในอนาคตสามารถค้นหาได้: (ใช้งานได้):

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

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

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

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


0

มีสองสิ่งสำคัญเกิดขึ้นที่นี่ฉันคิดว่า

1) มันง่ายมากที่จะทำให้ข้อ จำกัด ผิดพลาดหากคุณกำลังลาก ctrl + ดังนั้นให้ตรวจสอบอีกครั้งว่าคุณทำถูกต้องแล้ว ควรใช้ถาดทางด้านซ้ายของหน้าจอเพื่อวาดข้อ จำกัด เหล่านี้

2) แทนที่จะระบุค่าประมาณ HowHeight ใน ViewDidLoad หรือที่อื่นให้ใช้วิธีการมอบหมาย

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ทันที


ทำไมคุณถึงใช้การแทนที่
FractalDoctor

0

ฉันยังเห็นข้อผิดพลาดนี้เมื่อใช้สตอรีบอร์ดสากลหรือ xibs หากคุณละเลยที่จะระบุข้อ จำกัด ที่เหมาะสมสำหรับคลาส Any x Any size ฉันเห็นข้อผิดพลาดนี้ปรากฏขึ้น

ดูเหมือนว่า Apple จะแก้ไขปัญหานี้สำหรับ iOS9 แล้ว ข้อผิดพลาดเกิดขึ้นเฉพาะเมื่อ 8.4 สำหรับฉัน


0

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

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