Xcode 6 UIS ที่ปรับตัวได้นั้นจะเข้ากันได้กับ iOS 7 และ iOS 6 ได้อย่างไร


137

ฉันเพิ่งดูวิดีโอ WWDC # 216, "Building Adaptive UI กับ UIKit"

ที่ประมาณ 45:10 Tony Ricciardi พูดคุยเกี่ยวกับการเปลี่ยนแปลง IB ใน Xcode 6 เพื่อรองรับการเปลี่ยนแปลงใหม่

เขาบอกว่า "คุณสามารถปรับใช้เอกสารเหล่านี้ย้อนหลังเป็น iOS เวอร์ชันเก่า"

(โดยที่ "เอกสารเหล่านี้" อาจหมายถึง XIB และกระดานเรื่องราวที่มีการตั้งค่าเฉพาะสำหรับคลาสขนาดต่างกัน)

ฉันไม่ได้ทำขึ้น ไปดูวิดีโอของ WWDC

เป็นไปได้อย่างไร? คอลเล็กชันลักษณะและขนาดคลาสมีการกำหนดไว้ใน iOS 8 เท่านั้นลักษณะการทำงานแบบรันไทม์ที่ขึ้นอยู่กับโครงสร้าง UI ที่ใหม่กับ iOS 8 จะทำงานใน iOS เวอร์ชันก่อนหน้าได้อย่างไร

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


2
นอกจากนี้ยังมีเอกสารจาก Apple ที่อธิบายความเข้ากันได้กับรุ่น <8
Alladinian

คำตอบ:


151

การเปลี่ยนแปลงที่ทำกับ UI ด้วยขนาดคลาสในตัวสร้างส่วนติดต่อจะปรากฏอย่างถูกต้องบนอุปกรณ์ iOS 7 และตัวอย่างใน Xcode ตัวอย่างเช่นฉันเปลี่ยนข้อ จำกัด บางอย่างของเลย์เอาต์อัตโนมัติและขนาดตัวอักษรสำหรับความสูงปกติความกว้างปกติและข้อ จำกัด ที่เปลี่ยนนั้นสามารถมองเห็นได้ใน iPad Simulator ที่ใช้ iOS 7.0

การปรับขนาดคลาสให้เหมาะสมกับ iOS 7 ยกเว้นคลาสขนาดที่มีความสูงแบบกะทัดรัด สิ่งนี้ได้รับการยืนยันจาก Apple และได้ระบุไว้ในเอกสารโดยตรงแล้ว:

สำหรับแอพที่สนับสนุน iOS เวอร์ชันที่เก่ากว่า iOS 8 คลาสขนาดส่วนใหญ่สามารถใช้งานได้แบบย้อนหลัง

คลาสขนาดเข้ากันได้ย้อนหลังเมื่อ:
- แอพสร้างขึ้นโดยใช้ Xcode เวอร์ชัน 6 หรือใหม่กว่า
- เป้าหมายการปรับใช้ของแอพนั้นเร็วกว่า iOS 8
- ระบุขนาดคลาสไว้ในสตอรีบอร์ดหรือ xib
- ค่าองค์ประกอบความสูงไม่กะทัดรัด

เนื่องจาก iOS 7 ไม่เคารพคลาสสองขนาดหากคุณใช้พวกเขาคุณจะพบปัญหา ตัวอย่างเช่น: เมื่อคุณมี Compact w ใด ๆ h นิยามไว้แล้ว Compact w Compact h ที่กำหนดไว้บน iOS 7 มันจะเคารพ Compact w Any h ใด ๆ แต่บน iOS 8 จะทำให้ Compact w Compact h ปรากฏ

ดังนั้นหากคุณต้องการใช้คลาสสองขนาดนั้นและรักษาความเข้ากันได้กับ iOS 7 ฉันจะทำการปรับแต่งที่คุณต้องการสำหรับ iPhone ในแนวนอนในทุก ๆ w ใด ๆ h หรือกระชับ w ใด ๆ h แล้วทำการปรับอื่น ๆ ของคุณสำหรับคลาสขนาดอื่น ตามความจำเป็นและวิธีการที่คุณไม่จำเป็นต้องใช้คลาสขนาดใด ๆ ที่มีความสูงขนาดกะทัดรัดและจะหลีกเลี่ยงปัญหาที่เกิดขึ้น


ฉันสามารถยืนยันได้ว่าใน Beta4 คลาสขนาดกะทัดรัด / กะทัดรัดไม่ได้รับการเคารพในตัวจำลองหรือบนอุปกรณ์ iOS 7 ที่น่าสนใจว่าบางชั้นเรียนขนาดมีความเคารพว่า ขอบคุณสำหรับการทดสอบ
remmah

การทดสอบสำหรับ Regular / Regular บนอุปกรณ์และไม่ตอบสนองต่อการปรับแต่งขนาดของคลาสสิ่งที่ฉันได้รับคืออะไรก็ได้กับ Beta 7
hokiewalrus

@ hokiewalrus ฉันเพิ่งตรวจสอบกับ Xcode 6 beta 7 และได้รับผลลัพธ์เดียวกันแน่นอนฉันตอบในคำตอบ การเปลี่ยนความกว้างของกล่องใน IB สำหรับ Regular Regular แสดงอย่างถูกต้องบน iPad ที่ใช้ iOS 7.1
Jordan H

3
@ โจอี้นี่ไม่ใช่ข้อผิดพลาด; นี่คือเจตนา Compact-Compactไม่ได้ถูกส่งออกสำหรับ iOS 7 Compact-Regularคือ. ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
เดฟ DeLong

2
ควรเป็นคำตอบที่ยอมรับได้คำตอบข้างต้นทำให้เข้าใจผิด
Dominic Lacaille

68

เมื่อปรับใช้แอพของคุณกับ iOS 7 Xcode จะรวบรวมสตอรี่บอร์ดของคุณด้วยสองวิธีที่แตกต่างกัน:

  • สำหรับ iPhone สตอรี่บอร์ดของคุณได้รับการคอมไพล์เป็น "คอมแพค - ธรรมดา" (ความกว้างกะทัดรัดความสูงปกติ) และสิ่งนี้จะได้รับการจัดทำเป็นแพ็กเกจเหมือนกับ "~ iphone" ของคุณ

  • สำหรับ iPad กระดานเรื่องราวของคุณจะถูกรวบรวมเป็น "ปกติธรรมดา" และได้รับการบรรจุเป็นปลายปากกา "~ ipad" ของคุณ

ดังนั้นหากคุณต้องการปรับใช้กับทั้ง iOS 7 และ iOS 8 คุณควรเน้นการออกแบบของคุณในคลาส Compact-Any และ Regular-Any size ที่จะให้ประสบการณ์ที่ดีที่สุดในแง่ของการจับคู่ UI ข้ามเป้าหมายการปรับใช้ แน่นอนว่าคุณยินดีที่จะแก้ไขเลย์เอาต์สำหรับคลาสขนาดอื่น ๆ ยกเว้นว่าการแก้ไขเหล่านั้นจะถูกนำไปใช้กับคลาสขนาดกะทัดรัด - ปกติหรือปกติ - ปกติแล้วคุณจะไม่เห็นการแก้ไขเหล่านั้นบน iOS 7


ความเข้าใจในคำตอบของคุณคือ "ปกติธรรมดา" ควรทำงานใน iPad iOS7 แต่มันไม่ทำงาน ฉันทดสอบในรุ่น XCode6 GM แล้ว โปรดแก้ไขฉันหากฉันตีความคำตอบของคุณผิด
Iducool

4
ดูเหมือนว่าปกติจะทำงานเฉพาะบนกระดานเรื่องราวไม่ใช่ xib
Boris Charpentier

@ BorisCharpentier ฉันได้รายงานข้อผิดพลาดเกี่ยวกับrdarนั้น: // 18737656ที่ถูกปิดเหมือนสำเนาที่เปิด # 18490866
Maxim Pavlov

@ BorisCharpentier คุณพบทางออกสำหรับ xib หรือไม่?
saadnib

4
@ BorisCharpentier ฉันเพิ่งพบว่าปัญหานี้ได้รับการแก้ไขใน XCode 6.1.1 :-)
saadnib

27

หมายเหตุ: คำตอบนี้เกี่ยวข้องกับ Xcode 6 รุ่นเบต้าและไม่สามารถใช้ได้กับรุ่นการจัดส่งอีกต่อไป ดูคำตอบของJoeyและDave DeLongในหน้านี้สำหรับข้อมูลที่เหมาะสม

(คำตอบเดิมคงไว้ด้านล่าง):


ในขณะที่Storyboards/XIBsกำหนดค่าให้ใช้คลาสขนาดจะทำงานในiOS 7ขณะนี้ระบบปฏิบัติการไม่เคารพสิ่งเหล่านั้นsize classesและดูเหมือนจะใช้คลาสขนาดเริ่มต้น 'ใด ๆ / ใด ๆ '

ผมยอมรับว่าสไลด์โดยเฉพาะอย่างยิ่งคุณหมายถึงดูเหมือนจะเข้ากันได้ของสัญญาดังกล่าว (Xcode 6 beta 2)แต่ก็ไม่ปรากฏว่าเป็นกรณีที่ปัจจุบัน

ในการทดสอบฉันได้สร้างโครงการ(iOS 8 SDK, deployment target of 7.1)ด้วยปุ่มเดียวที่อยู่กึ่งกลางvertically and horizontallyในคลาสขนาดใดก็ได้ / ขนาดใดก็ได้ แต่จัดชิดกับมุมบนซ้ายของคลาสขนาดกะทัดรัด / กะทัดรัด (เช่น iPhone ในแนวนอน) Xcode พรีวิวช่วยแสดงให้เห็นว่าปุ่มเปลี่ยนตำแหน่งในแต่ไม่iOS 8 iOS 7ฉันยืนยันพฤติกรรมนี้ในiOS 7อุปกรณ์เช่นกัน


Roy ขอบคุณสำหรับการตอบกลับ ฉันยังไม่มีเวลาทดสอบตัวเองและขอขอบคุณ ผู้นำเสนอในวิดีโอนั้นควรชัดเจนขึ้น ฉันคิดว่าเขาต้องหมายความว่าไฟล์ XIB / Storyboard สามารถอ่านได้โดย iOS 6 และ 7 แต่ไม่สนับสนุน UI แบบปรับได้ มันทำให้การเข้ารหัสสำหรับแอปที่ทำงานบน iOS <8 มีปัญหา
Duncan C

จริง ฉันสงสัยว่ามีเอกสารอย่างเป็นทางการใด ๆ เกี่ยวกับวิธีการสนับสนุนคลาสขนาดใหม่และแนวทางปฐมนิเทศ / สำนวนเก่าใน Storyboard / XIB เดียวกัน ฉันจะอัปเดตคำตอบหากฉันพบสิ่งใด
remmah

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

3
นี่ดูเหมือนจะไม่เป็นเช่นนี้กับ Xcode 6 beta 4 ดูคำตอบที่ฉันเพิ่งเพิ่ม
Jordan H

1
@ Joey ขอบคุณสำหรับหัวขึ้น; ฉันได้แก้ไขคำตอบของฉันเพื่ออ้างอิงผู้อ่านถึงคำตอบของคุณเช่นเดียวกับเดฟ
remmah

12

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

~~~~~

การปรับใช้แอพที่มีคลาสขนาดบน iOS เวอร์ชันก่อนหน้า

สำหรับแอพที่สนับสนุน iOS เวอร์ชันที่เก่ากว่า iOS 8 คลาสขนาดส่วนใหญ่สามารถใช้งานได้แบบย้อนหลัง

คลาสขนาดเข้ากันได้ย้อนหลังเมื่อ:

  • แอปสร้างขึ้นโดยใช้ Xcode เวอร์ชัน 6 หรือใหม่กว่า
  • เป้าหมายการปรับใช้ของแอปนั้นเร็วกว่า iOS 8
  • ขนาดคลาสที่ระบุไว้ในกระดานเรื่องราวหรือ xib
  • ค่าของส่วนประกอบความสูงไม่กะทัดรัด

~~~~~

ที่กระสุนนัดสุดท้ายมีจุดมุ่งหมายที่การสนทนานี้ที่ Apple ยืนยันว่าตราบใดที่ไม่ได้ใช้"ความสูงขนาดกะทัดรัด"มันควรจะรักษาความเข้ากันได้ย้อนหลังได้

หวังว่านี่จะช่วยใครซักคน!


มันยอดเยี่ยมมากตอนนี้มีการบันทึกไว้แล้วขอบคุณสำหรับการโพสต์!
Jordan H

3

ในขณะที่จัดการกับปัญหาที่คล้ายกันฉันพบคำตอบอื่นที่ฉันยังไม่เห็นที่นี่ ดูเหมือนว่า Class Classes ในXIBไฟล์จะไม่ทำงานเลย ถ้าฉันสร้างต้นแบบของเซลล์ในstoryboardไฟล์มันทำงานใน iOS7 ตามที่อธิบายไว้ในคำตอบอื่น ๆ อย่างไรก็ตามเมื่อเซลล์ต้นแบบเดิมถูกย้ายไปยังXIBคลาสไฟล์ที่แยกต่างหาก- คลาสขนาดจะถูกละเว้นใน iOS7

นี่คือลิงค์ไปยังโครงการตัวอย่างที่แสดงพฤติกรรมนี้: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

ในเซลล์ต้นแบบฉันมีข้อ จำกัด สี่ข้อจากแต่ละมุมมองสีเทา แต่ละรายการมีการกำหนดค่าในลักษณะเดียวกัน: ใด ๆ / ใด ๆ - 10, ปกติ / ปกติ - 20

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

ใช้งานได้ดีใน iOS8 simulator สำหรับทั้ง XIB และ Storyboard และใน iOS7 เฉพาะเซลล์ที่กำหนดใน Storyboard เท่านั้นที่จะได้รับการปรับปรุงข้อ จำกัด บน iPad:

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


$ ^% $ ^% @ # ^ & @ #% & ^% ... และที่นี่ฉันมีไฟล์ xib มากมายและปรับใช้บน iOS 7 และ 8
TheEye

เผง ฉันรวมกระดานเรื่องราวของ iPhone และ iPad เป็นหนึ่งเดียวและคิดว่าการแยกเซลล์ออกเป็นไฟล์ XIB ของตัวเองจะช่วยได้ :) ฉันจะขอบคุณถ้าคุณสามารถ +1 คำตอบของฉัน
หม่า

1
ฉันเห็นพฤติกรรมเดียวกันนี้
bjtitus

2

ถ้ามันช่วยประหยัดเวลาทุกคนฉันเชื่อว่าวิธีที่ Xcode 6 มอบความเข้ากันได้แบบเสมือนสำหรับคลาสขนาดนั้นผ่านกระดานเรื่องราวประวัติศาสตร์~ipadและ~iphoneคำต่อท้ายและไม่มีอะไรเพิ่มเติม เรื่องนี้สมเหตุสมผลเนื่องจากคลาสขนาดเป็นวิธีที่เป็นนามธรรมมากกว่าวิธีที่เรากำหนดสตอรี่บอร์ด iPad และสตอรี่บอร์ด iPhone

ดังนั้น:

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

  • หากเป้าหมายของคุณคือการใช้คลาสขนาดเพื่อรองรับเลย์เอาต์ที่เปลี่ยนแปลงสำหรับรุ่นต่างๆภายในตระกูลอุปกรณ์เดียวกัน - เช่น iPhone 5/6/6 + รวม ภูมิทัศน์แล้วคุณจะโชคไม่ดี การใช้สิ่งเหล่านี้จะต้องมีเป้าหมายการปรับใช้ขั้นต่ำของ iOS 8


1

@lducool - ในเครื่องมือสร้างอินเตอร์เฟสในตัวตรวจสอบข้อมูลประจำตัวให้เปลี่ยน 'Builds For' เป็น iOS7.1 และใหม่กว่า


ไม่มีความแตกต่างในการส่งออก
Iducool

1

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

ฉันสร้างคำถามเฉพาะขึ้นมาสำหรับตัวอย่าง : ตัวอย่างสำหรับแนวนอนแนวตั้งแบบปรับตัวได้ของ iPhone ซึ่งเข้ากันได้กับ iOS 7

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

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