Trước hết, bạn không nên xây dựng lại tất cả các chế độ xem của mình để phù hợp với màn hình mới, cũng như không sử dụng các chế độ xem khác nhau cho các kích thước màn hình khác nhau.
Sử dụng khả năng tự động thay đổi kích thước của iOS, để chế độ xem của bạn có thể điều chỉnh và điều chỉnh bất kỳ kích thước màn hình nào.
Điều đó không khó lắm, hãy đọc một số tài liệu về điều đó. Nó sẽ giúp bạn tiết kiệm rất nhiều thời gian.
iOS 6 cũng cung cấp các tính năng mới về điều này.
Hãy chắc chắn đọc thay đổi API iOS 6 trên trang web Nhà phát triển của Apple.
Và kiểm tra các khả năng AutoLayout mới của iOS 6 .
Điều đó nói rằng, nếu bạn thực sự cần phát hiện iPhone 5, bạn chỉ cần dựa vào kích thước màn hình .
[ [ UIScreen mainScreen ] bounds ].size.height
Màn hình của iPhone 5 có chiều cao 568.
Bạn có thể tưởng tượng một macro, để đơn giản hóa tất cả những điều này:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Việc sử dụng fabs
với epsilon có ở đây để ngăn ngừa các lỗi chính xác, khi so sánh các điểm nổi, như được nêu trong các nhận xét của H2CO3.
Vì vậy, từ bây giờ bạn có thể sử dụng nó trong các câu lệnh if / other:
if( IS_IPHONE_5 )
{}
else
{}
Chỉnh sửa - Phát hiện tốt hơn
Như một số người đã nêu, điều này chỉ phát hiện màn hình rộng chứ không phải iPhone 5 thực tế.
Các phiên bản tiếp theo của iPod touch cũng có thể có màn hình như vậy, vì vậy chúng tôi có thể sử dụng một bộ macro khác.
Hãy đổi tên macro ban đầu IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Và hãy thêm các macro phát hiện mô hình:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Bằng cách này, chúng tôi có thể đảm bảo chúng tôi có một mẫu iPhone VÀ màn hình rộng và chúng tôi có thể xác định lại IS_IPHONE_5
macro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Cũng lưu ý rằng, như @ LearnCocos2D đã nêu, các macro này sẽ không hoạt động nếu ứng dụng không được tối ưu hóa cho màn hình iPhone 5 (thiếu hình ảnh Mặc định-568h@2x.png), vì kích thước màn hình vẫn sẽ là 320x480 một trường hợp.
Tôi không nghĩ đây có thể là một vấn đề, vì tôi không hiểu tại sao chúng tôi muốn phát hiện iPhone 5 trong một ứng dụng không được tối ưu hóa.
QUAN TRỌNG - Hỗ trợ iOS 8
Trên iOS 8, thuộc bounds
tính của UIScreen
lớp hiện phản ánh định hướng thiết bị .
Vì vậy, rõ ràng, mã trước đó sẽ không hoạt động.
Để khắc phục điều này, bạn chỉ cần sử dụng thuộc tính mới nativeBounds
, thay vì bounds
, nó sẽ không thay đổi theo hướng và vì nó dựa trên chế độ dọc.
Lưu ý rằng kích thước của nativeBounds
được đo bằng pixel, vì vậy đối với iPhone 5, chiều cao sẽ là 1136 thay vì 568.
Nếu bạn cũng đang nhắm mục tiêu iOS 7 trở xuống, hãy chắc chắn sử dụng tính năng phát hiện tính năng, vì việc gọi nativeBounds
trước iOS 8 sẽ làm hỏng ứng dụng của bạn:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Bạn có thể điều chỉnh các macro trước theo cách sau:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
Và rõ ràng, nếu bạn cần phát hiện iPhone 6 hoặc 6 Plus, hãy sử dụng các kích thước màn hình tương ứng.