Retina 디스플레이 검출
iOS SDK는 current Device에 고해상도 디스플레이(레티나)가 있는지 쉽게 확인할 수 있는 방법을 제공합니까?
지금 제가 찾은 최선의 방법은 다음과 같습니다.
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
// RETINA DISPLAY
}
모든 iOS 디바이스에서 Retina 디스플레이를 확실하게 검출하기 위해서는 디바이스가 iOS4+를 실행하고 있는지와[UIScreen mainScreen].scale
속성은 2.0과 동일합니다.디바이스가 iOS4+를 실행하고 있다고 가정할 수 없습니다.scale
iPad 3.2에도 이 속성이 포함되어 있으므로 속성이 존재합니다.
iOS3.2를 실행하는 iPad에서는 Retina 디스플레이가 탑재되어 있지 않은 경우에도 스케일은 1x 모드에서 1.0, 2x 모드에서 2.0을 반환합니다.Apple은 iOS4.2에서 iPad용으로 이 동작을 변경했습니다. 즉, 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
}
@sqp의 답변은 정확합니다.작업을 쉽게 하기 위해 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;
이것은 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
위의 답변의 신속한 버전. >= 2.0 스케일로 iPhone 6+ 및 Retina보다 더 높은 스케일의 기타 미래 장치를 포함합니다.
if UIScreen.mainScreen().respondsToSelector(Selector("scale")) && UIScreen.mainScreen().scale >= 2.0 {
// code executed only on Retina device
}
@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
누군가에게 유용할 수도 있어.
// .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;
}
이거 먹어봐
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0))
{
// Retina display
NSLog(@"---------------Retina display");
} else {
// non-Retina display
NSLog(@"---------------non-Retina display");
}
대부분의 일반적인 사용 사례를 단순화하기 위해 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)
이건 내게 효과가 있었다.
if((UIScreen .mainScreen().scale) < 2.0)
{
NSLog("no retina");
}
else
{
NSLog("retina");
}
언급URL : https://stackoverflow.com/questions/3504173/detect-retina-display
'IT' 카테고리의 다른 글
"git reset --hard"를 통해 커밋되지 않은 변경 손실로부터 복구 (0) | 2023.04.18 |
---|---|
VBA를 사용하여 Excel에서 워크시트 삭제 (0) | 2023.04.18 |
UILabel의 NSAttributedString에 탭 가능한 "링크"를 작성하시겠습니까? (0) | 2023.04.18 |
Git에서 분기 토폴로지를 시각화하는 중 (0) | 2023.04.18 |
PowerShell에서 한 줄씩 파일 읽기 (0) | 2023.04.18 |