Her şeyden önce, tüm ekranlarınızı yeni bir ekrana sığacak şekilde yeniden oluşturmamalı veya farklı ekran boyutları için farklı görünümler kullanmamalısınız.
İOS'unuzun otomatik yeniden boyutlandırma özelliklerini kullanın , böylece görünümleriniz herhangi bir ekran boyutunu ayarlayabilir ve uyarlayabilir.
Bu çok zor değil, bununla ilgili bazı belgeleri okuyun . Size çok zaman kazandıracak.
iOS 6 da bununla ilgili yeni özellikler sunuyor. Apple Developer web sitesinde iOS 6 API değişiklik günlüğünü
okuduğunuzdan emin olun .
Ayrıca yeni iOS 6 Otomatik Düzenleme özelliklerini kontrol edin .
Bununla birlikte, iPhone 5'i gerçekten algılamanız gerekiyorsa, ekran boyutuna güvenebilirsiniz .
[ [ UIScreen mainScreen ] bounds ].size.height
İPhone 5'in ekranı 568 yüksekliğe sahip.
Tüm bunları basitleştirmek için bir makro hayal edebilirsiniz:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
fabs
Epsilon ile kullanımı, kayan noktaları karşılaştırırken H2CO3'ün yorumlarında belirtildiği gibi hassas hataları önlemek için buradadır.
Artık bundan sonra standart if / else ifadelerinde kullanabilirsiniz:
if( IS_IPHONE_5 )
{}
else
{}
Düzenle - Daha iyi algılama
Bazı insanlar tarafından belirtildiği gibi, bu gerçek bir iPhone 5'i değil , sadece geniş bir ekranı algılar .
İPod touch'ın sonraki sürümlerinde de böyle bir ekran olabilir, bu yüzden başka bir makro seti kullanabiliriz.
Orijinal makroyu yeniden adlandıralım IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Ve model algılama makroları ekleyelim:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Bu şekilde, bir iPhone modelimiz ve geniş ekranımız olduğundan emin olabiliriz ve IS_IPHONE_5
makroyu yeniden tanımlayabiliriz :
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Ayrıca, @ LearnCocos2D tarafından belirtildiği gibi, uygulama iPhone 5 ekranı için optimize edilmemişse (Varsayılan-568h@2x.png resmi eksik) bu makroların çalışmadığı için ekran boyutu hala 320x480 olacaktır. bir olgu.
Optimize edilmemiş bir uygulamada neden bir iPhone 5'i tespit etmek istediğimizi anlamadığım için bunun bir sorun olabileceğini düşünmüyorum.
ÖNEMLİ - iOS 8 desteği
İOS 8'de, sınıfın bounds
özelliği UIScreen
artık aygıt yönünü yansıtıyor .
Açıkçası, önceki kod kutunun dışında çalışmayacak.
Bunu düzeltmek için, yönlendirmeyle değişmeyeceğinden ve bir portre modunu temel aldığı için yeni nativeBounds
özelliği kullanabilirsiniz bounds
.
Boyutlarının nativeBounds
piksel cinsinden ölçüldüğüne dikkat edin, bu nedenle iPhone 5 için yükseklik 568 yerine 1136 olacaktır .
Ayrıca iOS 7 veya daha düşük bir sürümü hedefliyorsanız, nativeBounds
iOS 8'den önce aramak uygulamanızın çökmesine neden olacağından özellik algılamayı kullandığınızdan emin olun :
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Önceki makroları aşağıdaki şekilde uyarlayabilirsiniz:
#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 )
Açıkçası, bir iPhone 6 veya 6 Plus'ı tespit etmeniz gerekiyorsa, ilgili ekran boyutlarını kullanın.