Saya baru saja memutakhirkan ke XCode 4.5 GM dan mengetahui bahwa Anda sekarang dapat menerapkan ukuran '4 "Retina' ke pengontrol tampilan Anda di storyboard.
Sekarang jika saya ingin membuat aplikasi yang berjalan pada iPhone 4 dan 5, tentu saja saya harus membangun setiap jendela dua kali, tetapi saya juga harus mendeteksi apakah pengguna memiliki iPhone dengan layar 3,5 "atau 4" dan kemudian menerapkan melihat.
Bagaimana saya harus melakukan itu?
Jawaban:
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 .
Layar iPhone 5 memiliki ketinggian 568.
Anda dapat membayangkan makro, untuk menyederhanakan semua ini:
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:
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
:Dan mari kita tambahkan makro deteksi model:
Dengan cara ini, kami dapat memastikan kami memiliki model iPhone DAN layar lebar, dan kami dapat mendefinisikan ulang
IS_IPHONE_5
makro:Perhatikan juga, seperti yang dinyatakan oleh @ LearnCocos2D, makro ini tidak akan berfungsi jika aplikasi tidak dioptimalkan untuk layar iPhone 5 (tidak ada gambar [email protected]), 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
propertiUIScreen
kelas sekarang mencerminkan orientasi perangkat .Jadi jelas, kode sebelumnya tidak akan berfungsi di luar kotak.
Untuk memperbaikinya, Anda cukup menggunakan
nativeBounds
properti baru , alih-alihbounds
, 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:Anda dapat mengadaptasi makro sebelumnya dengan cara berikut:
Dan jelas, jika Anda perlu mendeteksi iPhone 6 atau 6 Plus, gunakan ukuran layar yang sesuai.
sumber
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
tidak diperlukan di sini, dan==
perbandingan tidak akan gagal: hanya perlu melakukan perbandingan menggunakan perbedaan dengan cara ini jika nilai floating point tidak dapat dinyatakan sebagai angka yang tepat (seperti1.0/3.0*3.0
misalnya). Baca artikel ini untuk info lebih lanjut;)Diuji dan dirancang untuk kombinasi SDK dan OS:
Cepat
Jenis iPad ditambahkan. iPad 2 dan iPad mini adalah iPad non-retina. Sementara iPad Mini 2 & di atasnya, iPad 3, 4, iPad Air, Air 2, Air 3, dan iPad Pro 9.7 memiliki resolusi logis yang sama yaitu 1024. iPad Pro memiliki panjang maksimum 1366. Referensi
Lihat beraksi https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Catatan: Jika misalnya iPhone 6 dalam mode diperbesar, UI adalah versi diperbesar dari iPhone 5. Fungsi-fungsi ini tidak menentukan jenis perangkat, tetapi mode tampilan sehingga iPhone 5 adalah hasil yang diinginkan dalam contoh ini.
Objektif-C
Penggunaan: http://pastie.org/9687735
Catatan: Jika misalnya iPhone 6 dalam mode diperbesar, UI adalah versi diperbesar dari iPhone 5. Fungsi-fungsi ini tidak menentukan jenis perangkat, tetapi mode tampilan sehingga iPhone 5 adalah hasil yang diinginkan dalam contoh ini.
sumber
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
yang akan membantu menentukan perbedaan antara iPhone4 dan iPhone5 dan iPad Retina dan non-retinaSCREEN_MAX_LENGTH
untuk mendapatkan 568 di semua rotasi pada iPhone 5.Solusi yang sangat sederhana
sumber
Kita sekarang perlu memperhitungkan ukuran layar iPhone 6 dan 6Plus. Inilah jawaban yang diperbarui
Beberapa info bermanfaat
sumber
Saya telah mengambil kebebasan untuk menempatkan makro oleh Macmade ke dalam fungsi C, dan beri nama dengan benar karena mendeteksi ketersediaan layar lebar dan TIDAK perlu iPhone 5.
Makro juga tidak mendeteksi berjalan pada iPhone 5 jika proyek tidak menyertakan [email protected] . Tanpa gambar Default baru, iPhone 5 akan melaporkan ukuran layar 480x320 biasa (dalam poin). Jadi pemeriksaan tidak hanya untuk ketersediaan layar lebar tetapi untuk mode layar lebar yang diaktifkan juga.
sumber
inline
d. Mereka juga akan digarisbawahi di mana pengoptimal kompiler menganggap itu ide yang bagus dan di mana ia bisa tahu itu diizinkan (mis. Fungsi ada di modul yang sama). Menerapkan hal-hal seperti ini melalui fungsi kadang-kadang dapat membawa pemeriksaan tipe tambahan.Berikut adalah kode kami, uji lulus pada ios7 / ios8 untuk iphone4, iphone5, ipad, iphone6, iphone6p, tidak masalah pada perangkat atau simulator:
sumber
Saya menggunakan jawaban hfossli dan menerjemahkannya ke Swift
sumber
ini adalah makro untuk proyek cocos2d saya. harus sama untuk aplikasi lain.
sumber
sumber
Di Swift, proyek iOS 8+ saya ingin membuat ekstensi aktif
UIScreen
, seperti:(CATATAN:
nativeBounds
dalam piksel).Dan kodenya akan seperti:
Jadi kodenya memperjelas bahwa ini adalah pemeriksaan untuk layar utama, bukan untuk model perangkat.
sumber
Meminjam dari jawaban Samrat Mazumdar, berikut adalah metode singkat yang memperkirakan ukuran layar perangkat. Ini bekerja dengan perangkat terbaru, tetapi mungkin gagal pada perangkat yang akan datang (karena semua metode menebak mungkin). Ini juga akan menjadi bingung jika perangkat sedang dicerminkan (mengembalikan ukuran layar perangkat, bukan ukuran layar cermin)
sumber
Saya pikir itu harus baik jika makro ini akan berfungsi di perangkat dan simulator, di bawah ini solusinya.
sumber
Saya menemukan bahwa jawaban tidak termasuk kasus khusus untuk Simulator.
sumber
sumber
iPhone5 = FALSE;
tidak perlu karena variabel sudah memiliki nilai itu jika tidak berubahsumber
Mengandalkan ukuran itu salah dalam banyak tingkatan. Bagaimana kalau kita bertanya ke sistem?
Diambil dari Cara terbaik untuk mendeteksi tipe perangkat keras, iPhone4 atau iPhone5? , jawaban edzio27.
sumber
Dengan cara ini Anda dapat mendeteksi keluarga perangkat.
sumber
Jika proyek dibuat menggunakan Xcode 6, maka gunakan kode yang disebutkan di bawah ini untuk mendeteksi perangkat ..
Jika proyek dibuat dalam Xcode 5 dan dibuka di Xcode 6, maka gunakan kode yang disebutkan di bawah ini untuk mendeteksi perangkat. (Kode ini berfungsi jika tidak ada gambar peluncuran untuk iPhone 6,6+ ditugaskan)
Jika Anda masih menggunakan Xcode 5 secara bersamaan maka gunakan kode berikut untuk mendeteksi perangkat (iPhone 6 dan 6+ tidak akan terdeteksi)
sumber
Tambahkan 'File Swift Baru' ->
AppDelegateEx.swift
tambahkan ekstensi ke
AppDelegate
pemakaian:
sumber
Di Swift 3 Anda dapat menggunakan KRDeviceType kelas sederhana saya.
https://github.com/ulian-onua/KRDeviceType
Ini didokumentasikan dengan baik dan mendukung operator ==,> =, <=.
Misalnya untuk mendeteksi jika perangkat memiliki batasan iPhone 6 / 6s / 7, Anda dapat menggunakan perbandingan berikut:
Untuk mendeteksi apakah perangkat memiliki batasan iPhone 5 / 5S / SE atau yang lebih lama (iPhone 4s) Anda dapat menggunakan perbandingan berikutnya:
sumber
Ini telah dijawab ratusan kali tetapi solusi ini bekerja paling baik untuk saya dan membantu mengatasi masalah ketika perangkat baru diperkenalkan dan saya tidak memiliki ukuran yang ditentukan.
Pembantu 5 Swift:
Ini karena mudah untuk menghafal ukuran inci ponsel, seperti, perangkat "5,5 inci" atau "4,7 inci" tetapi sulit untuk mengingat ukuran piksel yang tepat.
Ini juga memberi Anda kesempatan untuk melakukan sesuatu seperti ini:
The default: mencoba untuk menggunakan ukuran layar dan skala untuk mencoba dan menghitung inci diagonal. Ini kalau-kalau beberapa ukuran perangkat baru muncul, itu akan mencoba yang terbaik untuk menentukan dan kode, seperti contoh terakhir, harus tetap berfungsi.
sumber
gunakan Kode berikut:
sumber
Berikut ini adalah pengujian perangkat yang benar, tanpa tergantung pada orientasinya
sumber
Digunakan untuk mendeteksi Perangkat iPhone dan iPad dari semua ayat.
sumber
IS_RETINA
iPhone 6 plus, kode 1x dieksekusi?@1x
, di mana ia seharusnya menghasilkan@3x
.