iOS SDK는 currentDevice에 고해상도 디스플레이 (망막)가 있는지 쉽게 확인할 수있는 방법을 제공합니까?
내가 지금 찾은 가장 좋은 방법은 다음과 같습니다.
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
iOS SDK는 currentDevice에 고해상도 디스플레이 (망막)가 있는지 쉽게 확인할 수있는 방법을 제공합니까?
내가 지금 찾은 가장 좋은 방법은 다음과 같습니다.
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
답변:
모든 iOS 기기에서 Retina 디스플레이를 안정적으로 감지하려면 기기에서 iOS4 +가 실행되고 있는지, [UIScreen mainScreen].scale
속성이 2.0 인지 확인해야합니다 . scale
iPad 3.2 에도이 속성이 포함되어 있으므로 속성이 존재하는 경우 장치에서 iOS4 +를 실행한다고 가정 할 수 없습니다 .
iOS3.2를 실행하는 iPad의 경우 기기에 Retina 디스플레이가 포함되어 있지 않은 경우에도 1x 모드에서 1.0, 2x 모드에서 2.0을 반환합니다. Apple은 iPad 용 iOS4.2에서이 동작을 변경했습니다. 1x 및 2x 모드에서 1.0을 반환합니다. 시뮬레이터에서 직접 테스트 할 수 있습니다.
-displayLinkWithTarget:selector:
iOS4.x에는 있지만 iOS3.2에는없는 기본 화면 에서 메소드를 테스트 한 다음 화면의 스케일을 확인하십시오.
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) {
// Retina display
} else {
// non-Retina display
}
[UIDevice currentDevice].systemVersion]
. 이 경우 NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion]; return [currentSystemVersion compare:version options:NSNumericSearch];
@sickp의 답변이 맞습니다. 작업을 쉽게하기 위해 Shared.pch 파일에 다음 줄을 추가하십시오.
#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))
그런 다음 모든 파일에서 다음을 수행 할 수 있습니다.
if(IS_RETINA)
{
// etc..
}
다음은 편리한 빠른 확장입니다.
Swift v5 업데이트 :
extension UIScreen {
public var isRetina: Bool {
guard let scale = screenScale else {
return false
}
return scale >= 2.0
}
public var isRetinaHD: Bool {
guard let scale = screenScale else {
return false
}
return scale >= 3.0
}
private var screenScale: CGFloat? {
guard UIScreen.main.responds(to: #selector(getter: scale)) else {
return nil
}
return UIScreen.main.scale
}
}
용법:
if UIScreen.main.isRetina {
// Your code
}
실물:
extension UIScreen {
public func isRetina() -> Bool {
return screenScale() >= 2.0
}
public func isRetinaHD() -> Bool {
return screenScale() >= 3.0
}
private func screenScale() -> CGFloat? {
if UIScreen.mainScreen().respondsToSelector(Selector("scale")) {
return UIScreen.mainScreen().scale
}
return nil
}
}
용법:
if UIScreen.mainScreen().isRetina() {
// your code
}
이 스 니펫 ...
int d = 0; // standard display
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) {
d = 1; // is retina display
}
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
d += 2;
}
표준 해상도 iPhone / iPod touch의 경우 0, retina iPhone의 경우 1, 표준 해상도 iPad의 경우 2, retina iPad의 경우 3이 반환됩니다.
SSToolkit에는 다음과 같은 방법이 있습니다.
http://sstoolk.it/documentation/ Categories / UIScreen (SSToolkitAdditions) .html
다음과 같은 방식으로 사용됩니다.
[[UIScreen mainScreen] isRetinaDisplay];
부동 소수점 값이 동일한 지 비교하기에는 항상 약간 불안합니다. 나는 어느 쪽이든가는 것을 선호한다
[UIScreen mainScreen].scale > 1.0;
또는
[UIScreen mainScreen].scale < 2.0;
isRetina = [UIScreen mainScreen].scale > 1.95
. 이것은 또한 @ 4x가 올 때 회복력이 있다는 이점을 가질 것입니다 :)
이것은 위의 Matt MC의 답변에 대한 리프입니다. 에 카테고리 만 있습니다 UIScreen
.
#import "UIScreen+Util.h"
@implementation UIScreen (Util)
+ (BOOL) isRetinaDisplay {
static BOOL retina = NO;
static BOOL alreadyChecked = NO;
if (!alreadyChecked) {
UIScreen *mainScreen = self.mainScreen;
if (mainScreen) {
retina = mainScreen.scale > 1.0;
alreadyChecked = YES;
}
}
return retina;
}
@end
alreadyChecked
이 무의미 하다고 생각 하지만 괜찮습니다.
@sickp의 답변과 @ n13의 다음 주석을 결합하여 UIScreen 범주로 만들었습니다. 확인은 처음 호출 할 때 수행 된 후 나중에 호출 할 수 있도록 저장됩니다.
@interface UIScreen (RetinaCheck)
+ (BOOL)retinaScreen;
@end
static BOOL isRetinaScreen = NO;
static BOOL didRetinaCheck = NO;
@implementation UIScreen (RetinaCheck)
+ (BOOL)retinaScreen
{
if (!didRetinaCheck) {
isRetinaScreen = ([[self mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([self mainScreen].scale == 2.0));
didRetinaCheck = YES;
}
return isRetinaScreen;
}
@end
누군가에게 유용 할 수 있습니다.
(Util)
대신하는 것입니다 (RetinaCheck)
... 아마 덜 명확하지만 다른 용도에 적합합니다. 또한로 isRetinaDisplay
시작 하는 메소드 또는 이름을 지정 is
하지만 Obj-C에 대한 지침을 이해하지 못했을 수도 있습니다. 또한 저는 팬 > 1.0
이지만, 앞으로 나아가는 것이 무엇인지 아는 사람입니다.
// .h
UIKIT_EXTERN bool isRetinaDisplay();
// .m
bool isRetinaDisplay()
{
static bool flag;
#ifdef __BLOCKS__
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
{
flag = [[UIScreen mainScreen] scale] > 1.0;
}
else
{
flag = false;
}
});
#else
static bool onceToken;
if(onceToken == false)
{
onceToken = true;
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
{
flag = [[UIScreen mainScreen] scale] > 1.0;
}
else
{
flag = false;
}
}
#endif
return flag;
}
가장 일반적인 사용 사례를 단순화하기 위해 primulaveris의 수정 된 버전입니다. 나는 빠른 2.2에 있지만 중요하지 않습니다.
extension UIScreen {
static var isRetina: Bool {
return screenScale >= 2.0
}
static var isRetinaHD: Bool {
return screenScale >= 3.0
}
static var screenScale:CGFloat {
return UIScreen.mainScreen().scale
}
}
그런 다음 간단히 이렇게 사용하십시오
print(UIScreen.isRetina)
print(UIScreen.isRetinaHD)
print(UIScreen.screenScale)