[ios] 망막 디스플레이 감지

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 인지 확인해야합니다 . scaleiPad 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
}


답변

@sickp의 답변이 맞습니다. 작업을 쉽게하기 위해 Shared.pch 파일에 다음 줄을 추가하십시오.

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale >= 2.0))

그런 다음 모든 파일에서 다음을 수행 할 수 있습니다.

if(IS_RETINA)
{
   // etc..
}


답변

+(BOOL)iPhoneRetina{
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0;
}


답변

다음은 편리한 빠른 확장입니다.

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;