Pertama-tama, Anda tidak harus membangun kembali semua tampilan Anda agar sesuai dengan layar baru, atau menggunakan tampilan yang berbeda untuk ukuran layar yang berbeda.
Gunakan kemampuan pengubahan ukuran otomatis iOS, sehingga tampilan Anda dapat menyesuaikan, dan mengadaptasi ukuran layar apa pun.
Itu tidak terlalu sulit, baca beberapa dokumentasi tentang itu. Ini akan menghemat banyak waktu.
iOS 6 juga menawarkan fitur-fitur baru tentang ini.
Pastikan untuk membaca changelog API iOS 6 di situs web Pengembang Apple.
Dan periksa kemampuan iOS 6 AutoLayout baru .
Yang mengatakan, jika Anda benar-benar perlu mendeteksi iPhone 5, Anda cukup mengandalkan ukuran layar .
[ [ UIScreen mainScreen ] bounds ].size.height
Layar iPhone 5 memiliki ketinggian 568.
Anda dapat membayangkan makro, untuk menyederhanakan semua ini:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Penggunaan fabs
dengan epsilon ada di sini untuk mencegah kesalahan presisi, saat membandingkan titik apung, seperti yang ditunjukkan dalam komentar oleh H2CO3.
Jadi mulai sekarang Anda bisa menggunakannya dalam pernyataan if / else standar:
if( IS_IPHONE_5 )
{}
else
{}
Edit - Deteksi yang lebih baik
Seperti yang dinyatakan oleh beberapa orang, ini hanya mendeteksi layar lebar , bukan iPhone 5 yang sebenarnya.
Versi iPod touch berikutnya mungkin juga memiliki layar seperti itu, jadi kami dapat menggunakan set makro lain.
Mari kita ganti nama makro asli IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Dan mari kita tambahkan makro deteksi model:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Dengan cara ini, kami dapat memastikan kami memiliki model iPhone DAN layar lebar, dan kami dapat mendefinisikan ulang IS_IPHONE_5
makro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Perhatikan juga, seperti yang dinyatakan oleh @ LearnCocos2D, makro ini tidak akan berfungsi jika aplikasi tidak dioptimalkan untuk layar iPhone 5 (tidak ada gambar Default-568h@2x.png), karena ukuran layarnya masih 320x480 dalam kondisi seperti itu. sebuah kasus.
Saya tidak berpikir ini mungkin menjadi masalah, karena saya tidak melihat mengapa kami ingin mendeteksi iPhone 5 di aplikasi yang tidak dioptimalkan.
PENTING - Dukungan iOS 8
Di iOS 8, bounds
properti UIScreen
kelas sekarang mencerminkan orientasi perangkat .
Jadi jelas, kode sebelumnya tidak akan berfungsi di luar kotak.
Untuk memperbaikinya, Anda cukup menggunakan nativeBounds
properti baru , alih-alih bounds
, karena tidak akan berubah dengan orientasi, dan karena didasarkan pada mode potret-up.
Perhatikan bahwa dimensi nativeBounds
diukur dalam piksel, jadi untuk iPhone 5 tingginya akan menjadi 1136, bukan 568.
Jika Anda juga menargetkan iOS 7 atau lebih rendah, pastikan untuk menggunakan deteksi fitur, karena panggilan nativeBounds
sebelum iOS 8 akan membuat aplikasi Anda macet:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Anda dapat mengadaptasi makro sebelumnya dengan cara berikut:
#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 )
Dan jelas, jika Anda perlu mendeteksi iPhone 6 atau 6 Plus, gunakan ukuran layar yang sesuai.