ปัญหาการจัดวางหลังจากอัปเดตเป็น Xcode 8


102

นี่คือก่อนและหลังของหน้าจอหนึ่งของฉันหลังจากที่ฉันอัปเกรดเป็น Xcode 8
ทั้งหมดที่ฉันทำคือเปิดmain.storyboardของฉันจากนั้นฉันสร้างและเรียกใช้แอพของฉันบนโทรศัพท์ของฉัน
ในการควบคุมเวอร์ชันของฉันฉันเห็น Xcode กำลังทำการเปลี่ยนแปลงมากมายกับ main.storyboard ของฉันเพียงแค่เปิดมันขึ้นมา
เมื่อใดก็ตามที่ฉันลบการเปลี่ยนแปลงเหล่านั้นฉันจะเห็นสิ่งที่ฉันใช้เพื่อดูใน Xcode 7.3.1
แต่ทันทีที่ฉันเปิดตัวสร้างส่วนต่อประสานกับสตอรีบอร์ดของฉันอีกครั้งฉันก็เห็นการเปลี่ยนแปลงเหล่านั้นกลับมา

มีอะไรที่ฉันสามารถทำได้ที่นี่?

ก่อน Xcode 8

ใส่คำอธิบายภาพที่นี่

หลังจากอัปเดตเป็น Xcode 8

ใส่คำอธิบายภาพที่นี่


ลองเปิด XCode 8 อีกครั้งด้วยแหล่งข้อมูลใหม่ (ซ่อนการเปลี่ยนแปลงที่ทำไว้ก่อนหน้านี้) ตอนนี้เมื่อคุณเปิดกระดานเรื่องราวให้ไฮไลต์รายการ UI ทั้งหมดของคุณแล้วคลิก "อัปเดตเฟรม" วิธีนี้อาจแก้ปัญหาของคุณได้
d1str0

6
คุณช่วยยื่นข้อบกพร่องที่ bugreport.apple.com และแนบสตอรี่บอร์ดที่เกิดขึ้นได้ไหม เราอยากจะวิเคราะห์เพิ่มเติม
Quinn Taylor

1
ฉันมีปัญหาเดียวกันแน่นอน หลังจากเปิดสตอรี่บอร์ดของฉันใน Xcode8 และยอมรับกล่องโต้ตอบ "เลือกมุมมองอุปกรณ์เริ่มต้น" ทุกอย่างก็ดูแปลก ๆ เมื่อฉันอัปเดตเฟรมทั้งหมด IB จะดูดี แต่หลังจากสร้างแล้วแอปก็เสียโดยสิ้นเชิง ทดสอบกับ 4 แอพ
Cherrypig

@QuinnTaylor ฉันมีปัญหาที่คล้ายกันหลังจาก Xcode 8 แปลงสตอรี่บอร์ดของฉัน UIImageViews ใน UITableViews จะไม่แสดงเนื้อหาใด ๆ แม้ว่าเค้าร่างของพวกเขาจะมองเห็นได้ในDebug View Hierarchy. วัตถุอื่น ๆ ของคลาสเดียวกันที่อยู่ใน UICollectionViews จะไม่ได้รับผลกระทบ
Manuel

XIB หรือ Storyboard ตั้งค่าเริ่มต้นเป็นเวอร์ชันเก่ากว่า 7.x และ Save and Close วิธีแก้ปัญหาชั่วคราว แต่ใช้งานได้ อย่าเปิดอีกครั้งเมื่อคุณบันทึกและปิดเสร็จแล้ว มิฉะนั้นอีกครั้งต้องทำตามขั้นตอนเดียวกันตั้งแต่เริ่มต้น
Bhavesh Kumbhani

คำตอบ:


111

ฉันมีปัญหาคล้ายกันกับภาพ tableview ไม่ปรากฏขึ้นเมื่อฉันแปลงไฟล์ storyboard ให้เข้ากันได้กับ Xcode8 ดูเหมือนว่ามีข้อผิดพลาดกับ Xcode8 ดังนั้นจนกว่าจะมีการเผยแพร่การแก้ไขข้อบกพร่องนี่คือวิธีแก้ปัญหา:

  1. เปิดสตอรี่บอร์ดของคุณใน Xcode 8 แล้วเลือกมุมมองอุปกรณ์เริ่มต้น ทำการเปลี่ยนแปลงตามปกติ
  2. เมื่อคุณทำการเปลี่ยนแปลงเสร็จแล้วให้เลือกกระดานเรื่องราว -> ตัวตรวจสอบไฟล์ -> เปิดใน -> เลือก 'Xcode 7.x'

ใส่คำอธิบายภาพที่นี่

  1. เลือก 'บันทึกและปิด' เมื่อได้รับแจ้ง
  2. การเปลี่ยนแปลงสตอรีบอร์ดของคุณจะได้รับการบันทึกและสตอรีบอร์ดของคุณจะทำงานเหมือนกับที่ทำไว้ล่วงหน้า

เมื่อคุณต้องการทำการเปลี่ยนแปลงอื่น ๆ กับไฟล์สตอรีบอร์ดให้ทำตามขั้นตอนเหล่านี้อีกครั้ง


ว้าว +1 เรื่องนี้แน่นอน ฉันต่อสู้กับสิ่งนี้ใน iOS 10 ภายใน TodayExtension ของฉัน มันไม่ได้จนกว่าฉันจะ จำกัด สิ่งต่างๆให้แคบลงวิเคราะห์ความแตกต่างของคอมไพล์ฉันเห็นการแก้ไข xml ของสตอรี่บอร์ดที่น่าสงสัยถูกเพิ่มโดย Xcode 8 หลังจากบันทึกเอกสารสตอรี่บอร์ดสำหรับ Xcode 7 (หลังจากทำการแก้ไขแล้ว) ตอนนี้ฉันสามารถสร้างและจัดส่งโดยใช้ Xcode 8 สำหรับ iOS 10 ขอบคุณ
John Erck

แน่ใจว่ามีข้อบกพร่อง การบันทึกเป็นเปิดใน Xcode 7.x ใช้งานได้สำหรับฉันเป็นวิธีแก้ปัญหาชั่วคราว
Steve A

ฉันใช้เวลา 3 วันที่ผ่านมาในการแก้ไขเลย์เอาต์ที่เสียทั้งหมดจากที่หนึ่งไปยังอีกที่หนึ่งใน Xcode8 จนกระทั่งพบโพสต์นี้ ฉันน่าจะเชื่อใจคนแบบพวกคุณมากกว่า Apple ไม่อยากจะเชื่อเลยว่ามันเสียเวลาไปมากแล้ว ขอบคุณเดวิดมากสำหรับสิ่งนี้!
Xu Yin

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

@ ฮันนี่ฉันไม่ได้ทำแบบนั้นบนสตอรีบอร์ด แต่ฉันทำกับไฟล์ xib ทุกไฟล์ที่ฉันมีปัญหา แต่ฉันคิดว่าคุณอาจต้องการลองใช้บนสตอรีบอร์ดเช่นกันหากคุณพบปัญหาการจัดวางที่แปลกประหลาด เนื่องจากการแก้ไขนั้นจะใช้เวลาเพียง 5 วินาที และหลังจากสร้างแอปใหม่แล้วคุณจะสามารถเห็นการแก้ไขได้อย่างรวดเร็ว
Xu Yin

14

XIB หรือ Storyboard ตั้งค่าเริ่มต้นเป็นเวอร์ชันเก่ากว่า 7.x และ Save and Close วิธีแก้ปัญหาชั่วคราว แต่ใช้งานได้ อย่าเปิดอีกครั้งเมื่อคุณบันทึกและปิดเสร็จแล้ว มิฉะนั้นอีกครั้งต้องทำตามขั้นตอนเดียวกันตั้งแต่เริ่มต้นใส่คำอธิบายภาพที่นี่


6
สิ่งนี้ไม่ได้ช่วยอะไรเพราะฉันต้องทำงานกับไฟล์ ทั้งหมดนี้คือบันทึกไฟล์เพื่อความเข้ากันได้แบบย้อนหลัง ไม่อนุญาตให้แก้ไข xib ใน Xcode 8
jowie

ฉันกำลังทำสิ่งนี้ แต่อีกครั้งเมื่อฉันเลือกไฟล์ xib ในรายการแบบเลื่อนลงมันแสดง xcode 8.0 เท่านั้น ...
jayant rawat

8

เอ๊ะปัญหาเดียวกัน ฉันจัดการบางส่วนเพื่อแก้ไขด้วยวิธีต่อไปนี้ ( สำหรับ Xcode เวอร์ชัน 8.1 (8B62) )

ในโครงร่างเอกสารของ Storyboard ฉันคลิกที่แต่ละฉากซึ่งมีลูกศรสีเหลืองแสดงปัญหาการจัดวางบางอย่าง (หมายเลข 1 บนภาพหน้าจอ)

หลังจากนี้สำหรับแต่ละฉากที่มีปัญหาฉันต้องคลิกที่ไอคอนขนาดเล็ก "อัปเดตเฟรม" (หมายเลข 2 บนภาพหน้าจอ) ซึ่งจะแก้ไขปัญหาการจัดวางทั้งหมดต่อฉาก

ใส่คำอธิบายภาพที่นี่

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

ว้าวไม่แปลกใจเลยสำหรับ XCode8 และ Storyboards หากคุณใช้โปรแกรมแก้ไข AppCode คุณจะไม่มีปัญหาดังกล่าวเนื่องจากไม่รองรับ Storyboards

โชคดี!



6

โปรดติดตามเธรดสำหรับวิธีแก้ปัญหาที่เป็นไปได้: (ฉันเชื่อว่ามันเกิดขึ้นกับนักพัฒนาหลายคน)
Xcode 8 GM seed สตอรี่บอร์ดปัญหา
Xcode 8 - สตอรีบอร์ดก่อนหน้าเริ่มบิดเบี้ยว

(ฉันใช้ความกว้างใด ๆ ก็ตามที่ 600) เมื่อ Xcode อัปเดตเป็น Xcode 8 จะเปลี่ยนขนาด ViewControllers ทั้งหมดของฉัน เป็นผลให้เค้าโครงทั้งหมดผิดเพี้ยน
ขณะนี้ฉันเห็นวิธีแก้ปัญหาเพียง 3 วิธีเท่านั้น (ฉันไม่วางใจที่จะรอการแก้ไขในไม่ช้า)

1.Go สำหรับแต่ละ Viewcontroller Update Framesและแก้ไขได้โดย

2. ไปที่ ViewController หลักSize Inspector -> Freeform -> 600เนื่องจากตัวควบคุมส่วนใหญ่อนุมานได้ว่าจะเปลี่ยนขนาดสำหรับทุกตัว (โปรดระวังผลกระทบของคุณสมบัติใหม่ที่ Apple ต้องการแนะนำ)

3. ยกเลิกการเปลี่ยนแปลงในคอมไพล์สำหรับสตอรีบอร์ด (ฉันไม่แนะนำให้ทำเพราะ Apple ได้แทรกการอัปเดตบางอย่างซึ่งอาจมีความสำคัญต่อ Xcode)

ลิงก์เพิ่มเติมสำหรับคุณสมบัติ AutoLayout ใหม่ใน Xcode 8 (WWDC16): การ สร้างแอป Adaptive ตอนที่ 1


1
ตัวเลือกที่ 1 เหมาะสมที่สุดและได้ผลสำหรับฉัน ดังที่ Mike.R กล่าวโปรดระวังการพยายาม 'หลอกล่อ' XCode เพื่อแก้ไขปัญหาต่างๆเนื่องจากปัญหาที่เกิดขึ้นในเส้นทางนั้นเป็นสิ่งที่หลีกเลี่ยงไม่ได้
arcady bob

ฉันใช้ตัวเลือกที่ 1 เช่นกัน (ฉันคิดว่าปลอดภัยกว่า) แต่ใช้เวลานาน
Mike.R

5

ในกรณีของฉันใช้วิธีแก้ปัญหาที่ Akhil Kateja แนะนำและฉันต้องรีเซ็ตความกว้างและความสูงของมุมมองหลักด้วย:

1) กำหนดขนาดมุมมองเป็นรูปแบบอิสระ

ใส่คำอธิบายภาพที่นี่

2) รีเซ็ตความกว้างและความสูงของมุมมองเป็นขนาดเดิม:

ใส่คำอธิบายภาพที่นี่

ในที่สุดบันทึกและคุณทำเสร็จแล้ว


4

สำหรับฉันวิธีแก้ปัญหาคือเพียงคลิกที่ UIViewController ที่มีปัญหาแล้ว Editor > Resolve Auto Layout Issues > All Views In ... > Updates Frames

มันจัดเรียงมุมมองใหม่เพื่อให้เหมาะกับข้อ จำกัด ที่มีอยู่ตามมุมมองเริ่มต้นที่เลือกใหม่ (iPhone 7 ในกรณีของฉัน)

โปรดทราบ: หากคุณได้รับคำเตือนมุมมองที่ผิดตำแหน่งของแถบนำทางเหมือนที่ฉันทำเพียงแค่เลือก UINavigationController / UIViewController จากนั้นAttributes Inspector > Bar Visibility > Shows Navigation Bar- สลับเป็นปิดแล้วเปิดอีกครั้ง


3

การตั้งค่า View Size เป็นFreeformจากInferredใช้ได้ผลสำหรับฉัน มันสามารถพบได้ภายใต้หัวข้อจำลองตัวชี้วัดในคุณสมบัติสารวัตร


3

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

self.view.layoutIfNeeded()

1
ไชโยบิล! 'layoutIfNeeded' นั้นใช้ได้ผลสำหรับฉัน! (หลังจากลองทำอย่างอื่นมาหลายชั่วโมง .. )
Ethan Halprin

3

ฉันเลือกคอนโทรลเลอร์แต่ละตัวและคลิกที่ "อัปเดตเฟรม" และแก้ไขเค้าโครง


3

คำตอบจาก @ david-truong ( https://stackoverflow.com/a/39589860/1407528 ) ใช้ไม่ได้ในกรณีของฉันดังนั้นหากคุณอยู่ในสถานการณ์เดียวกันให้ลองทำดังนี้:

  • ดาวน์โหลด Xcode 7.3.1 ก่อนหน้าจากที่นี่: https://developer.apple.com/download/more/
  • ยกเลิกการเปลี่ยนแปลงทั้งหมดของคุณ (หากคุณมีตัวจัดการโค้ดเช่น git หากไม่มีคุณควร ' https://githowto.com/ ')
  • เปิดโปรเจ็กต์ด้วย Xcode 7.3.1

ในกรณีที่คุณอัปเดตอุปกรณ์ทั้งหมดเป็น iOS 10+ Xcode เวอร์ชันนี้จะไม่รับรู้ว่าอุปกรณ์เหล่านั้นเป็นอุปกรณ์ที่รองรับ ลองใช้เคล็ดลับนี้:

  • ไปที่: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • คัดลอกโฟลเดอร์ที่เกี่ยวข้องกับ iOS 10 หรือ 10.1 ไปยัง: / Applications / Xcode 7.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • เปิดโปรเจ็กต์ด้วย Xcode 7.3.1 (รีสตาร์ท Xcode หากคุณเปิดไว้แล้ว)
  • เลือกอุปกรณ์ iOS 10+ ที่เชื่อมต่อของคุณ
  • กดเรียกใช้

หมายเหตุ: ฟีเจอร์ใหม่เช่น Swift จะไม่สามารถใช้ได้โดยใช้เคล็ดลับนี้ แต่คุณควรจะโหลดและสร้างโปรเจ็กต์ของคุณได้


3

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

เมื่อฉันอัปเดต Xcode จาก 7.3 เป็น Xcode 8 และเรียกใช้แอปมุมมองบางส่วนจะแสดงอย่างสมบูรณ์แบบ แต่บางมุมมองผิดเพี้ยนจากนั้นฉันตรวจสอบไฟล์หัวปากกาและแจ้งให้ฉันเลือกขนาดอุปกรณ์เฉพาะจากนั้นแสดงปลายปากกาตามนั้น ขนาดของอุปกรณ์ซึ่งเป็น offcourse Any-Any(Xcode 7.3)ไม่ ดังนั้นไฟล์ nibs ทั้งหมดจึงไม่แสดงด้วยวิธีที่ถูกต้อง

วิธีแก้ปัญหาจากฉัน: - กดลูกศรสีเหลืองเหมือนที่แสดงในภาพด้านล่าง

ใส่คำอธิบายภาพที่นี่

จะมีป๊อปอัปแสดงตัวเลือกเช่น

ใส่คำอธิบายภาพที่นี่

เลือกUpdate Framesด้วยการApply to all views in containerตรวจสอบมันจะแก้ไขได้ประมาณ 90% ของ UI ที่ผิดเพี้ยนและปัญหาข้อ จำกัด การจัดวางอัตโนมัติที่เหลือสามารถแก้ไขได้ด้วยตนเอง


สิ่งนี้อาจทำให้เสียเลย์เอาต์ IMHO จะต้องดำเนินการด้วยความระมัดระวังมากครั้งละหนึ่งมุมมองและตรวจสอบว่าสิ่งต่างๆได้ผลหรือไม่ก่อนดำเนินการต่อ
brainray

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

1

ฉันแก้ไขปัญหาโดยใช้ Xcode เวอร์ชัน 7.3.1 คุณสามารถดาวน์โหลดไฟล์. dmg จากพอร์ทัลนักพัฒนาแอปเปิ้ล ฉันใช้การปรับอัตโนมัติในทุกแอปและมันก็ใช้ได้ดีสำหรับฉัน ฉันจะอัปเดตเป็น Xcode 8 ก็ต่อเมื่อสามารถแก้ไขข้อบกพร่องนี้ได้

ดาวน์โหลดได้ที่นี่: https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg


วิธีนี้ไม่มีประโยชน์หากคุณต้องการรองรับ iOS 10
jungledev

1

เพื่อแก้ไขปัญหาที่คล้ายกันฉันกำหนดค่า xib เป็น Freeform (ไม่ใช่ Inferred) และบันทึกไฟล์ xib เป็น Xcode 7.x เข้ากันได้ ทั้งสองขั้นตอนจำเป็นในกรณีของฉัน หวังว่าจะช่วยได้!


1

ฉันสังเกตเห็นปุ่มใหม่หนึ่งปุ่มใน Xcode 8.2 (ตรวจสอบวงกลมสีส้มในภาพ) มันจะช่วยคุณได้บ้าง

ขั้นตอน: 1. เปิดกระดานเรื่องราวและเลือกอุปกรณ์ที่คุณต้องการ 2. เพียงแค่เลือก View Controller 3. คลิกปุ่มที่กล่าวถึง (ตามภาพ) 4. จะอัปเดตเฟรมสำหรับตัวควบคุมมุมมองนั้นและคุณสามารถดำเนินการต่อได้

ฉันไม่พบทางออกที่ดีไปกว่านี้ โปรดตอบกลับหากพบ

ภาพหน้าจอ IB


ไม่มีอะไรเกิดขึ้น
Muju

0

อัปเดตข้อ จำกัด และมุมมองย่อยเค้าโครงใน viewdidload ช่วยแก้ปัญหาได้

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.