ความกว้างสูงสุดของเลย์เอาต์อัตโนมัติที่ต้องการไม่สามารถใช้กับ iOS เวอร์ชันก่อนหน้า 8.0


322

ฉันเปิดโครงการ iOS ที่มีอยู่ด้วย Xcode6 beta6 และ Xcode จะแสดงคำเตือนต่อไปนี้สำหรับทั้ง Storyboard และ Xib ไฟล์:

ความกว้างสูงสุดของเลย์เอาต์อัตโนมัติที่ต้องการไม่สามารถใช้กับ iOS เวอร์ชันก่อนหน้า 8.0

ฉันพยายามระบุคำเตือนด้วยการตั้งค่าความกว้างให้ชัดเจนดังนี้:

แต่สิ่งนี้ไม่สามารถแก้ไขคำเตือนได้ พวกเขาจะถูกลบออกได้อย่างไร?


3
ฉันใช้ XCode 6.1 และอัปเดตป้ายกำกับทั้งหมดของฉันเป็น Preferred Width = Explicit วิธีนี้แก้ไขปัญหาสำหรับฉัน
djburdick

คำตอบ:


373

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

ขั้นตอนในการสร้างซ้ำ:

  1. สร้างโครงการมุมมองเดียวเป้าหมายใหม่
  2. ตั้งค่าเป้าหมายการปรับใช้เป็น 7.1
  3. เปิดกระดานเรื่องราวของโครงการ
  4. วางเลเบลลงบนตัวควบคุมมุมมองที่จัดเตรียมไว้
  5. ตั้งค่า numberOfLines สำหรับเลเบลนั้นเป็น 2
  6. รวบรวม

ฉันได้ยื่นเรดาร์ต่อไปนี้:
rdar: // problem / 18700567

อัปเดต 2:
น่าเสียดายนี่คือสิ่งที่เกิดขึ้นอีกครั้งในรุ่น Xcode 6 โปรดทราบว่าส่วนใหญ่แล้วคุณสามารถแก้ไขสตอรี่บอร์ด / xib ได้ด้วยตนเองเพื่อแก้ไขปัญหา ต่อCharles A.ในความคิดเห็นด้านล่าง:

เป็นมูลค่าการกล่าวขวัญว่าคุณสามารถแนะนำคำเตือนนี้ได้โดยง่ายโดยไม่ตั้งใจและการเตือนนั้นไม่ได้ช่วยในการค้นหาฉลากที่เป็นตัวการ นี่คือโชคร้ายในกระดานเรื่องราวที่ซับซ้อน คุณสามารถเปิดกระดานเรื่องราวเป็นไฟล์ต้นฉบับและค้นหาด้วย regex <label(?!.*preferredMaxLayoutWidth)เพื่อค้นหาป้ายกำกับที่ละเว้นแอตทริบิวต์ / ค่าที่ต้องการ MaxMayLayoutWidth หากคุณเพิ่มใน PreferredMaxLayoutWidth = "0" บนบรรทัดดังกล่าวจะเหมือนกับการทำเครื่องหมายที่ชัดเจนและการตั้งค่า 0

อัปเดต 1:
ข้อบกพร่องนี้ได้รับการแก้ไขแล้วใน Xcode 6 GM

คำตอบเดิม
นี่เป็นข้อผิดพลาดใน Xcode6-Beta6 และ XCode6-Beta7 และสามารถละเว้นได้อย่างปลอดภัยในตอนนี้

วิศวกรแอปเปิ้ลในฟอรั่มสำหรับนักพัฒนาแอปเปิ้ลนี้จะพูดเกี่ยวกับข้อผิดพลาด:

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

iOS 8 เพิ่มการรองรับสำหรับการคำนวณที่ต้องการโดยอัตโนมัติ MaxLayoutWidth ที่รันไทม์ซึ่งทำให้การสร้างป้ายกำกับหลายบรรทัดง่ายยิ่งขึ้น การตั้งค่านี้ไม่เข้ากันได้กับ iOS 7 เพื่อสนับสนุนทั้ง iOS 7 และ iOS 8, Xcode 6 ช่วยให้คุณสามารถเลือก "อัตโนมัติ" หรือ "ชัดเจน" สำหรับการเลือก MaxLayoutWidth ในเครื่องมือตรวจสอบขนาด คุณควร:

เลือก "อัตโนมัติ" หากกำหนดเป้าหมายเป็น iOS 8 เพื่อประสบการณ์ที่ดีที่สุด เลือก "ชัดเจน" หากกำหนดเป้าหมาย <iOS 8 จากนั้นคุณสามารถป้อนค่าที่ต้องการ MaxLayoutWidth ที่คุณต้องการตั้งค่า การเปิดใช้งานค่าเริ่มต้น "ชัดเจน" เป็นขนาดขอบเขตปัจจุบันในเวลาที่คุณทำเครื่องหมายในช่อง

คำเตือนจะปรากฏขึ้นหาก (1) คุณกำลังใช้เลย์เอาต์อัตโนมัติ (2) "Automatic" ถูกตั้งค่าสำหรับป้ายกำกับหลายบรรทัด [คุณสามารถตรวจสอบได้จากตัวตรวจสอบขนาดสำหรับฉลาก] และ (3) เป้าหมายการปรับใช้ <iOS 8

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

คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยใช้ตัวตรวจสอบไฟล์บนกระดานเรื่องราวหรือ xib ที่มีปัญหาและเปลี่ยน "Builds สำหรับ" เป็น "Builds สำหรับ iOS 8.0 และใหม่กว่า" ตัวตรวจสอบไฟล์ Xcode


15
เป็นมูลค่าการกล่าวขวัญว่าคุณสามารถแนะนำคำเตือนนี้ได้โดยง่ายโดยไม่ตั้งใจและการเตือนนั้นไม่ได้ช่วยในการค้นหาฉลากที่เป็นตัวการ นี่คือโชคร้ายในกระดานเรื่องราวที่ซับซ้อน คุณสามารถเปิดกระดานเรื่องราวเป็นไฟล์ต้นฉบับและค้นหาด้วย regex <label(?!.*preferredMaxLayoutWidth)เพื่อค้นหาป้ายกำกับที่ไม่ใช้preferredMaxLayoutWidthแอตทริบิวต์ / ค่า ถ้าคุณเพิ่มในสายดังกล่าวก็เป็นเช่นเดียวกับการทำเครื่องหมายอย่างชัดเจนและการตั้งค่าpreferredMaxLayoutWidth="0" 0
Charles A.

6
มีวิธีใดในการกำหนดค่า UILabel โดยทางโปรแกรมเพื่อปรับค่าที่ต้องการ MaxLayoutWidth โดยอัตโนมัติโดยไม่ต้องทำการแบ่งคลาสย่อยหรือนำไปใช้งานในเค้าโครง หากนี่เป็นพฤติกรรมที่ IB สามารถเปิดใช้งานได้แสดงว่ามีคุณสมบัติหรือค่าเวทมนต์ที่สามารถตั้งค่าได้ แต่ไม่มีอะไรใน API เอกสารหรือส่วนหัวบอกว่า
สาหร่าย

2
@CharlesA ฉันได้ทดสอบกับโปรเจ็กต์ว่างและพบว่ามีแอททริบิวต์เลเบลอื่นที่จะทำให้เกิดคำเตือนนี้: หากnumberOfLinesตั้งค่าเป็นอะไรก็ได้ แต่ 1 การเตือนจะเกิดขึ้นไม่ว่าคุณจะpreferredMaxLayoutWidthตั้งค่าไว้หรือไม่ก็ตาม
memmons

2
@ MichaelG.Emmons แปลกฉันไม่สามารถทำซ้ำกับโครงการที่สะอาดและเป้าหมายการปรับใช้เป็น 7.1 เมื่อฉันตั้งค่าpreferredMaxLayoutWidthเป็น 0 ชัดเจนคำเตือนจะหายไปโดยไม่คำนึงถึงnumberOfLinesค่า แต่บางทีนี่อาจได้รับการแก้ไขในการอัพเดท Xcode เมื่อเช้านี้?
Charles A.

2
ดังนั้น ... เป็นทางออกเดียวในการกำหนดจำนวนบรรทัดเป็น 1 และเปลี่ยนจากรหัส? ดูเหมือนจะไม่เป็นมืออาชีพ
jomafer

315

หากต้องการค้นหาฉลากปัญหาในกระดานเรื่องราวขนาดใหญ่ทำตามขั้นตอนของฉันด้านล่าง

  1. ใน xCode's Issue Navigator คลิกขวาที่ข้อผิดพลาดและเลือก "เปิดเผยการเข้าสู่ระบบ" (หมายเหตุ: @Sam แนะนำด้านล่างให้ดูในเนวิเกเตอร์รายงานของxCode และ @Rivera โน้ตในความคิดเห็นที่ "ในฐานะของ Xcode 6.1.1 การคลิกที่คำเตือนจะเปิดขึ้นโดยอัตโนมัติและไฮไลต์ฉลากที่ขัดแย้งกัน" ฉันยังไม่ได้ทดสอบ )

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

  1. วิธีนี้จะแสดงข้อผิดพลาดพร้อมรหัสท้ายไฟล์เรื่องราวของคุณ คัดลอกค่าหลัง. storyboard

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

  1. ถัดไปเปิดเผยกระดานเรื่องราวของคุณเป็นไฟล์ต้นฉบับ ป้อนคำอธิบายรูปภาพที่นี่

  2. ค้นหา. คุณควรจะสามารถบอกได้ว่ามันติดป้ายกำกับอะไรจากที่นี่ค่อนข้างง่ายโดยดูที่เนื้อหา ป้อนคำอธิบายรูปภาพที่นี่

เมื่อคุณพบป้ายกำกับโซลูชันที่ใช้งานได้สำหรับฉันคือตั้งค่า "ความกว้างที่ต้องการ" เป็น 0

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

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

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


36
นี่ควรเป็นคำตอบที่ยอมรับได้! วิธีนี้แก้ปัญหาได้จริง นอกจากนี้ยังช่วยค้นหาปัญหาอื่น ๆ ในกระดานเรื่องราวซึ่งไม่ปรากฏขึ้นตามปกติ สิ่งหนึ่ง: ฉันพบว่าReport Navigatorมีความน่าเชื่อถือมากกว่าการคลิกขวาที่ "เปิดเผยในบันทึก"
Sam Spencer

1
รักคำตอบนี้ง่ายมากและแก้ไขคำเตือน ขอบคุณมาก!
Ethan Parker

1
ขอบคุณมาก soooo muchhhhhh :)
SR Nayak

2
ทำไมคุณตั้งค่าความกว้างที่ต้องการเป็นศูนย์แทนที่จะเป็นความกว้างที่แสดงในเครื่องมือสร้างส่วนต่อประสาน
Biclops

9
คำตอบที่ยอดเยี่ยม! คุณสามารถค้นหา id ของวัตถุได้โดยตรงจากมุมมอง IB ของกระดานเรื่องราว เพียงทำ Ctrl-f ไม่จำเป็นต้องเปิดเป็นซอร์สโค้ดจากนั้นจึงต้องเปลี่ยนกลับไปเป็นมุมมอง IB เพื่อเปลี่ยนความกว้างที่ต้องการ
AndroidDev

36

คุณสามารถแก้ไขปัญหานี้ได้โดยไม่ต้องเปิดกระดานเรื่องราวเป็นแหล่งที่มา คำเตือนนี้ถูกเรียกใช้โดย UILabels ถ้า numberOfLines! = 1 และเป้าหมายการปรับใช้คือ <8.0

จะหามันได้อย่างไร

  1. ไปที่ Issue Navigator (CMD + 8) และเลือกบิวด์ล่าสุดที่มีคำเตือน ป้อนคำอธิบายรูปภาพที่นี่
  2. ค้นหาคำเตือน (ค้นหา " รูปแบบสูงสุดที่ต้องการโดยอัตโนมัติ ") แล้วกดปุ่มขยายทางด้านขวา
    ป้อนคำอธิบายรูปภาพที่นี่
  3. ค้นหา Object IDของ UILabel ป้อนคำอธิบายรูปภาพที่นี่
  4. เปิดกระดานเรื่องราวและค้นหา (CMD + f) สำหรับวัตถุ มันจะเลือกและไฮไลท์ UILabel
  5. ตั้งค่าความกว้างที่ต้องการ = 0 "ชัดเจน"ตามที่คนอื่นแนะนำ

23

การแก้ปัญหามันค่อนข้างง่าย

เพียงเปิดใช้งาน Builds สำหรับ iOS 8 และใหม่กว่า

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


ค่อนข้างง่ายและทำลายล้าง มีผู้ใช้ iOS เพียง 85% เท่านั้นที่อยู่ใน iOS8 + developer.apple.com/support/app-store
aryaxt

6
@aryaxt ฉันขอโทษที่บอกว่าคุณคิดผิด คุณสามารถกำหนดเป้ คุณสามารถตรวจสอบได้ที่นี่developer.apple.com/library/ios/recipes/…
Alejandro Luengo

1
เช่นเคยคำตอบที่ดีที่สุดไม่ใช่คำตอบที่ยอมรับได้ ... :) ไชโย!
HepaKKes

อัปเดตสำหรับ iOS9.3 และสูงกว่า: อุปกรณ์ iOS7 จะไม่แสดงกระดานเรื่องราวด้วยการตั้งค่าข้างต้นอีกต่อไป สิ่งนี้เคยทำงานก่อนการอัพเดท 9.3 ดูเหมือนว่า Apple จะเปลี่ยนแปลงบางอย่างในกระบวนการอัตโนมัติก่อนวางจำหน่าย
pechar

4

ตอนนี้เวอร์ชัน Xcode ของฉันคือ 6.1 แต่ฉันก็ได้รับคำเตือนนี้เช่นกัน มันทำให้ฉันรำคาญมาก หลังจากค้นหาอีกครั้งและอีกครั้งฉันพบวิธีแก้ปัญหา

สาเหตุ: คุณต้องตั้งค่า UILabel Lines> 1 ใน Storyboard ของคุณ

วิธีแก้ไข: ตั้งค่าแอตทริบิวต์ UILabel Lines ของคุณเป็น 1 ใน Storyboard รีสตาร์ท Xcode ของคุณ มันใช้งานได้สำหรับฉันหวังว่าจะสามารถช่วยผู้คนได้มากขึ้น

หากคุณต้องการแสดงคำพูดของคุณมากกว่า 1 บรรทัด คุณควรทำในรหัส

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

3
"ถ้าคุณต้องการแสดงคำของคุณมากกว่า 1 บรรทัดจริงๆคุณควรทำมันในรหัส" นี่คือโทรลล์ใช่ไหม?
webstersx

@webstersx ฉันคิดว่าเขาจริงจัง
Jasper

4

เพื่อสรุปให้ฉันทำตามคำแนะนำสองข้อด้านบนเพื่อเปลี่ยนอินสแตนซ์ใด ๆ ที่ numberOfLines = 0 ถึง 1 หรือมากกว่านั้นและเพิ่ม PreferredMaxLayoutWidth = "0" ด้วยตนเองในแต่ละอินสแตนซ์ของป้ายกำกับภายในสตอรี่บอร์ดสตอเรจแก้ไขคำเตือนทั้งหมดของฉัน


คุณเป็นพ่อมด! ทำงานได้แม้กับ UIScrollerView ตามที่คาดไว้ ทางออกที่ดีที่สุดจนถึงตอนนี้เพราะฉันสามารถทิ้งเป้าหมายการปรับใช้ของ Nib ไว้ใน iOS7.0
Yaro

3

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

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


คุณหมายถึงการค้นหาในโครงการเพื่อหาฉลากรหัส
Borzh

2

ฉันได้มันทำงานโดยเลือกเค้าโครงต้นฉบับที่ฉันมีในการเลือก W / H กระดานเรื่องราวทำงานตามที่คาดไว้และข้อผิดพลาดหายไป

ให้แน่ใจว่าคุณกำลังพัฒนาสำหรับ iOS 8.0 ตรวจสอบว่าจากการตั้งค่าทั่วไปของโครงการ

นี่คือที่ที่คุณควรกด


1

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

เมื่อวางฉลากหลายบรรทัดในจะไม่มีการตั้งค่าข้อ จำกัด ในการบังคับใช้ความกว้างภายในมุมมองพาเรนต์ นี่คือที่ PreferredMaxWidth ใหม่เข้ามาเล่น ใน iOS 7 และก่อนหน้านี้คุณต้องกำหนดความกว้างสูงสุดด้วยตนเอง ฉันเพิ่มข้อ จำกัด 10px ลงทางด้านซ้ายและขวาของฉลาก

นอกจากนี้คุณยังสามารถเพิ่มข้อ จำกัด <= width ซึ่งแก้ไขปัญหาได้เช่นกัน

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

โซลูชันด้านบนของฉันช่วยให้มั่นใจได้ว่ารักษาความกว้างไว้เสมอไม่ว่ามุมมองพาเรนต์จะใหญ่แค่ไหน


1

ด้วยเหตุผลบางอย่างแม้ว่าการเปลี่ยนเป้าหมายการปรับใช้ iOS เป็น 8.0 หรือสูงกว่าไฟล์ Xib จะไม่ยอมรับการเปลี่ยนแปลงนั้นและยังคงอยู่กับการตั้งค่าก่อนหน้าในตัวตรวจสอบไฟล์

ตัวตรวจสอบไฟล์ใน Xib หลังจากเปลี่ยนเป้าหมายการปรับใช้ iOS

ดังนั้นคุณควรเปลี่ยนด้วยตนเองสำหรับแต่ละ Xib หลังจากการเปลี่ยนแปลงด้วยตนเอง

เมื่อเสร็จแล้วคำเตือนจะหายไป :-)

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