본문 바로가기

Mac&iOS

런타임때 레티나 디스플레이 체크

우선 프로젝트에 해상도별로 imageName.png와 imageName@2x.png 를 넣어 둔다.

이렇게 하면 [NSImage imageNamed:@"imageName"]; 를 이용하면 알아서 모니터 해상도에 맞게 이미지를 가져오게 된다.

하지만 프로젝트에 포함되지 않은 이미지의 경우는 이렇게 할 수 없다.


할 수 없이 현재 디스플레이가 레티나인지 여부를 런타임때 확인하여 imageName 에 @2x 를 붙여 넣는 소스를 작성하였다. 

그렇게 좋은 소스는 아니나 런타임 때 레티나 디스플레이인지 체크하는 방법이다. 


float displayScale = 1;   

 if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) {


        NSArray *screens = [NSScreen screens];


        for (int i = 0; i < [screens count]; i++) {


            float s = [[screens objectAtIndex:i] backingScaleFactor];


            if (s > displayScale)


                displayScale = s;

        }


    }


레티나 디스플레이의 경우 displayScale 값이 2의 값으로 온다. 아마 2보다 큰 값도 오지 않을까 생각된다. 

일단 이 로직에 문제점은 듀얼 모니터의 경우 하나라도 레티나 디스플레이가 있을 경우 레티나 디스플레이로 체크한다는 것이다. 


좀더 정확하게 체크하는 방법을 찾을 필요가 있어 보인다. 




출처 : http://stackoverflow.com/questions/11067066/mac-os-x-best-way-to-do-runtime-check-for-retina-display