Làm thế nào để các giao diện người dùng thích ứng Xcode 6 có thể tương thích ngược với iOS 7 và iOS 6?


137

Tôi vừa xem video WWDC # 216, "Xây dựng giao diện người dùng thích ứng với UIKit."

Vào khoảng 45:10 Tony Ricciardi nói về những thay đổi đối với IB trong Xcode 6 để hỗ trợ những thay đổi mới.

Ông nói "Bạn có thể triển khai các tài liệu này ngược với các phiên bản iOS cũ hơn".

(trong đó "Những tài liệu này" có lẽ có nghĩa là XIB và bảng phân cảnh có cài đặt cụ thể cho các lớp kích thước khác nhau.)

Tôi không làm điều này lên. Đi xem video WWDC.

Làm thế nào là có thể? Bộ sưu tập đặc điểm và các lớp kích thước chỉ được xác định trong iOS 8. Làm thế nào để hành vi thời gian chạy phụ thuộc vào cấu trúc UI mới đối với iOS 8 hoạt động trong các phiên bản iOS trước?

Nếu nó có thể nó sẽ là tuyệt vời. Bạn có thể xây dựng các ứng dụng sẽ chạy trên iOS 6, 7 và 8 và tận dụng các khả năng bố trí UI linh hoạt mới mà Apple đã thêm vào Xcode 6. Tôi đã tự tạo ra logic UI thích ứng trong mã và nó khá ít của công việc.


2
Hiện tại cũng có một tài liệu từ Apple mô tả khả năng tương thích với các phiên bản <8
Alladinian

Câu trả lời:


151

Các thay đổi được thực hiện cho Giao diện người dùng với Lớp Kích thước trong Trình tạo giao diện DO xuất hiện chính xác trên các thiết bị iOS 7 và Bản xem trước trong Xcode. Ví dụ: tôi đã thay đổi một số ràng buộc Bố cục tự động và kích thước phông chữ cho Chiều cao thông thường Chiều rộng thông thường và các ràng buộc thay đổi đó có thể nhìn thấy trong Trình mô phỏng iPad chạy iOS 7.0.

Tất cả các tối ưu hóa lớp kích thước được cung cấp cho iOS 7, ngoại trừ các lớp kích thước có Chiều cao nhỏ gọn. Điều này đã được Apple xác nhận và hiện được nêu trực tiếp trong tài liệu :

Đối với các ứng dụng hỗ trợ các phiên bản iOS sớm hơn iOS 8, hầu hết các lớp kích thước đều tương thích ngược.

Các lớp kích thước tương thích ngược khi:
- Ứng dụng được xây dựng bằng Xcode phiên bản 6 trở lên
- Mục tiêu triển khai của ứng dụng sớm hơn iOS 8
- Các lớp kích thước được chỉ định trong bảng phân cảnh hoặc xib
- Giá trị của thành phần chiều cao không nhỏ gọn

Bởi vì iOS 7 không tôn trọng một vài lớp kích thước, nếu bạn sử dụng chúng, bạn sẽ gặp vấn đề. Ví dụ: Khi bạn có Compact w Bất kỳ h được xác định và sau đó Compact w Compact h được xác định, trên iOS 7, nó sẽ tôn trọng Compact w Any h nhưng trên iOS 8, nó hiển thị giao diện Compact w Compact h.

Vì vậy, nếu bạn muốn sử dụng hai lớp kích thước đó và duy trì khả năng tương thích với iOS 7, tôi sẽ thực hiện bất kỳ tối ưu hóa nào bạn muốn cho iPhone theo chiều ngang trong Bất kỳ h hay Compact w Bất kỳ h, sau đó thực hiện các tối ưu hóa khác của bạn cho các lớp kích thước khác nhau khi cần thiết và theo cách đó bạn sẽ không cần sử dụng bất kỳ lớp kích thước nào với chiều cao nhỏ gọn và sẽ tránh gặp phải các vấn đề.


Tôi có thể xác nhận rằng trong Beta4, lớp kích thước Nhỏ gọn / Nhỏ gọn không được tôn trọng trong trình giả lập hoặc trên thiết bị iOS 7. Điều thú vị là một số lớp kích thước được tôn trọng mặc dù. Cảm ơn đã thử nghiệm.
remmah

Kiểm tra tính thường xuyên / thường xuyên trên thiết bị và nó không đáp ứng với các tùy chỉnh của lớp kích thước, tất cả những gì tôi nhận được là Bất kỳ / Bất kỳ với Beta 7
hokiewalrus

@hokiewalrus Tôi vừa kiểm tra bằng Xcode 6 beta 7 và nhận được kết quả chính xác giống như tôi đã nêu chi tiết trong câu trả lời. Thay đổi độ rộng của hộp trong IB cho Thường xuyên không hiển thị chính xác trên iPad chạy iOS 7.1.
Jordan H

3
@Jeyey đây không phải là một lỗi; Đây là cố ý. Compact-Compactkhông được xuất cho iOS 7; Compact-RegularLà. Xem câu trả lời của tôi để biết thêm chi tiết.
Dave DeLong

2
Nên là câu trả lời được chấp nhận, câu trả lời ở trên là sai lệch.
Đaminh Lacaille

68

Khi triển khai ứng dụng của bạn lên iOS 7, Xcode sẽ biên dịch bảng phân cảnh của bạn theo hai cách khác nhau:

  • Đối với iPhone, bảng phân cảnh của bạn được biên dịch thành "Nhỏ gọn thông thường" (Chiều rộng nhỏ gọn, chiều cao thông thường) và phần này được đóng gói dưới dạng ngòi "~ iphone" của bạn.

  • Đối với iPad, bảng phân cảnh của bạn được biên dịch thành "Thông thường-Thường xuyên" và được đóng gói dưới dạng ngòi "~ ipad" của bạn.

Vì vậy, nếu bạn đang muốn triển khai cho cả iOS 7 và iOS 8, bạn nên tập trung thiết kế của mình vào các lớp kích thước Nhỏ gọn-Bất kỳ và Thường xuyên-Bất kỳ. Điều đó sẽ cung cấp cho bạn trải nghiệm tốt nhất về mặt phù hợp với giao diện người dùng trên các mục tiêu triển khai. Tất nhiên, bạn sẵn sàng sửa đổi bố cục cho các lớp kích thước khác, nhưng trừ khi những sửa đổi đó sẽ được áp dụng cho các lớp kích thước Nhỏ gọn hoặc Chính quy-Thường xuyên, thì bạn sẽ không thấy các sửa đổi đó trên iOS 7.


Tôi hiểu câu trả lời của bạn là "Thường xuyên-Thường xuyên" sẽ hoạt động trong iPad iOS7. Nhưng nó không hoạt động. Tôi đã thử nghiệm trong phiên bản XCode6 GM. Xin vui lòng sửa cho tôi nếu tôi đã giải thích sai câu trả lời của bạn.
Iducool

4
Có vẻ như thường xuyên chỉ hoạt động trên bảng phân cảnh, không phải xib
Boris Charpentier

@BorisCharpentier Tôi đã báo cáo một lỗi về thứ đó : // 18737656 , đã bị đóng như là bản sao của mở # 18490866
Maxim Pavlov

@BorisCharpentier bạn đã tìm thấy giải pháp nào cho xib chưa?
saadnib

4
@BorisCharpentier, tôi chỉ thấy rằng vấn đề này đã được giải quyết trong XCode 6.1.1 :-)
saadnib

27

Lưu ý: Câu trả lời này có liên quan đến phiên bản beta của Xcode 6 và không còn áp dụng cho phiên bản giao hàng. Xem câu trả lời của JoeyDave DeLong trên trang này để biết thông tin chính xác.

(câu trả lời ban đầu được giữ lại bên dưới):


Mặc dù được Storyboards/XIBsđịnh cấu hình để sử dụng các lớp kích thước sẽ chạy trên iOS 7, nhưng HĐH hiện không tôn trọng các lớp đó size classesvà dường như sử dụng lớp kích thước 'Bất kỳ / Bất kỳ' mặc định.

Tôi đồng ý rằng slide cụ thể mà bạn đang đề cập dường như hứa hẹn khả năng tương thích như vậy, nhưng hiện tại nó không giống như trường hợp (Xcode 6 beta 2).

Để kiểm tra, tôi đã tạo một dự án (iOS 8 SDK, deployment target of 7.1)với một nút duy nhất được đặt vertically and horizontallyở giữa lớp Kích thước bất kỳ / Bất kỳ, nhưng được căn chỉnh ở góc trên cùng bên trái trong lớp kích thước Nhỏ gọn / Nhỏ gọn (ví dụ: iPhone nằm ngang). Trình trợ lý xem trước của Xcode cho thấy nút này thay đổi vị trí của nó iOS 8, nhưng không iOS 7. Tôi đã xác nhận hành vi này trên một iOS 7thiết bị là tốt.


Roy, cảm ơn vì đã trả lời. Tôi chưa có thời gian để tự kiểm tra điều này và tôi đánh giá cao nó. Người trình bày trong video đó nên được rõ ràng hơn. Tôi nghĩ rằng anh ta có nghĩa là các tệp XIB / Storyboard có thể được đọc bởi iOS 6 và 7, nhưng không có hỗ trợ cho giao diện người dùng thích ứng. Nó làm cho mã hóa cho các ứng dụng chạy trên iOS <8 có vấn đề.
Duncan C

Thật. Tôi tự hỏi nếu có bất kỳ tài liệu chính thức nào về cách hỗ trợ các lớp kích thước mới hơn và cách tiếp cận định hướng / thành ngữ cũ hơn trong cùng Storyboard / XIB. Tôi sẽ cập nhật câu trả lời nếu tôi tìm thấy bất cứ điều gì.
remmah

Theo kinh nghiệm của tôi, Apple dường như nghĩ rằng các phiên bản HĐH cũ hơn sẽ ngừng tồn tại ngay khi họ công bố một phiên bản mới. Trên thực tế, đội ngũ kỹ thuật dường như ngừng chú ý đến một phiên bản HĐH mới ngay khi phát hành và bắt đầu tập trung tất cả năng lượng của họ vào phiên bản chính tiếp theo. Tôi KHÔNG BAO GIỜ có một lỗi tôi đã gửi trong bản phát hành chính hiện tại. Họ
Duncan C

3
Đây không còn là trường hợp của Xcode 6 beta 4. Xem câu trả lời tôi vừa thêm.
Jordan H

1
@Joey cảm ơn vì đã ngẩng cao đầu; Tôi đã chỉnh sửa câu trả lời của mình để giới thiệu cho độc giả về câu trả lời của bạn, cũng như của Dave.
remmah

12

Vì một số câu trả lời và nhận xét đang thảo luận về bản chất của tính tương thích ngược, tôi nghĩ rằng tôi sẽ chia sẻ một đoạn trích trực tiếp từ Tài liệu của Apple :

~~~~~

Triển khai một ứng dụng với các lớp kích thước trên các phiên bản iOS trước đó

Đối với các ứng dụng hỗ trợ các phiên bản iOS sớm hơn iOS 8, hầu hết các lớp kích thước đều tương thích ngược.

Các lớp kích thước tương thích ngược khi:

  • Ứng dụng được xây dựng bằng Xcode phiên bản 6 trở lên
  • Mục tiêu triển khai của ứng dụng sớm hơn iOS 8
  • Các lớp kích thước được chỉ định trong bảng phân cảnh hoặc xib
  • Giá trị của thành phần chiều cao không nhỏ gọn

~~~~~

Điểm đạn cuối cùng đó được nhắm mục tiêu trong cuộc thảo luận này, trong đó Apple xác nhận rằng miễn là "chiều cao nhỏ gọn" không được sử dụng , thì nó nên duy trì khả năng tương thích ngược.

Hy vọng điều này sẽ giúp được ai đó!


Thật tuyệt khi điều này được ghi lại, cảm ơn vì đã đăng!
Jordan H

3

Trong khi xử lý vấn đề tương tự tôi đã tìm thấy một câu trả lời khác mà tôi chưa thấy ở đây. Có vẻ như Lớp Kích thước trong XIBcác tệp không hoạt động. Nếu tôi tạo nguyên mẫu ô trong storyboardtệp, nó hoạt động trong iOS7 như được giải thích trong các câu trả lời khác, tuy nhiên khi cùng một ô nguyên mẫu được chuyển sang XIBcác lớp kích thước tệp riêng biệt sẽ bị bỏ qua trong iOS7.

Đây là liên kết đến dự án mẫu thể hiện hành vi này: https://dl.dropboxusercontent.com/u/6402890/testSizeC Cầu.zip

Trong ô nguyên mẫu, tôi có bốn ràng buộc từ mỗi cạnh của khung nhìn màu xám. Mỗi trong số đó được cấu hình theo cùng một cách: Bất kỳ / Bất kỳ - 10, Thường xuyên / Thường xuyên - 20

nhập mô tả hình ảnh ở đây

Nó hoạt động tốt trong trình giả lập iOS8 cho cả XIB và Storyboard và trong iOS7, chỉ có các ô được xác định trong Storyboard được cập nhật các ràng buộc trên iPad:

nhập mô tả hình ảnh ở đây


$ ^% $ ^% @ # ^ & @ #% & ^% ... và ở đây tôi có rất nhiều tệp xib và triển khai trên iOS 7 và 8.
TheEye

Chính xác. Tôi đã kết hợp các bảng phân cảnh iPhone và iPad thành một và nghĩ rằng tách các ô thành tệp XIB của riêng chúng sẽ giúp :). Tôi sẽ đánh giá cao nếu bạn có thể +1 câu trả lời của tôi.
sha

1
Tôi đang thấy hành vi tương tự.
bjtitus

2

Nếu nó tiết kiệm thời gian cho bất kỳ ai, tôi tin rằng cách Xcode 6 cung cấp khả năng tương thích ngược cho các lớp kích thước là thông qua lịch sử ~ipad~iphone bảng phân cảnh hậu tố, và không có gì hơn thế. Điều này có ý nghĩa vì các lớp kích thước là một cách trừu tượng hơn về cách trước đây chúng ta đã xác định bảng phân cảnh iPad và bảng phân cảnh iPhone.

Vì thế:

  • Nếu mục tiêu của bạn là sử dụng các lớp kích thước để hỗ trợ bố cục cụ thể của gia đình thiết bị (iPad so với iPhone), thì bạn thật may mắn: các lớp kích thước là giao diện đẹp hơn so với phương thức được hỗ trợ trước đó.

  • Nếu mục tiêu của bạn là sử dụng các lớp kích thước để hỗ trợ bố cục thay đổi cho các kiểu máy khác nhau trong cùng một họ thiết bị - tức là. iPhone 5/6/6 + inc. Cảnh quan, sau đó bạn là hết may mắn . Sử dụng chúng sẽ yêu cầu mục tiêu triển khai iOS 8 tối thiểu.


1

@lducool - Trong trình tạo giao diện, trong trình kiểm tra danh tính, thay đổi 'Bản dựng cho' thành iOS7.1 trở lên.


Không có sự khác biệt trong đầu ra.
Iducool

1

Thật không may, câu trả lời từ Dave và Joey không làm việc cho tôi. Tôi không được phép bình luận trong chủ đề này, vì vậy xin vui lòng tha thứ cho tôi nếu đây là sai địa điểm.

Tôi đã đưa ra một câu hỏi cụ thể cho điều đó: Ví dụ về giao diện người dùng thích ứng ngang dọc iPhone tương thích ngược với iOS 7

Từ những gì tôi học được cho đến nay, tôi tin rằng, như trong ví dụ của tôi, không thể có 2 ràng buộc riêng biệt, khác nhau cho một yếu tố ui trong chế độ dọc và ngang với iPhone iOS7 dựa trên các lớp kích thước. Sẽ rất vui nếu tôi nhầm, mặc dù.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.