태그 보관물: detect

detect

iOS 매크로로 iPhone X, iPhone 6 plus, iPhone 6, iPhone 5, iPhone 4를 감지하는 방법은 무엇입니까? bounds].size.height ==

매크로로 장치 모델을 감지하는 방법은 무엇입니까? 나는 이런 것을 사용했지만 시뮬레이터의 결과는 항상 IS_IPHONE_5

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)  


답변

빠른

import UIKit

public enum DisplayType {
    case unknown
    case iphone4
    case iphone5
    case iphone6
    case iphone6plus
    static let iphone7 = iphone6
    static let iphone7plus = iphone6plus
    case iphoneX
}

public final class Display {
    class var width:CGFloat { return UIScreen.main.bounds.size.width }
    class var height:CGFloat { return UIScreen.main.bounds.size.height }
    class var maxLength:CGFloat { return max(width, height) }
    class var minLength:CGFloat { return min(width, height) }
    class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
    class var retina:Bool { return UIScreen.main.scale >= 2.0 }
    class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
    class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
    class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
    class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
    class var typeIsLike:DisplayType {
        if phone && maxLength < 568 {
            return .iphone4
        }
        else if phone && maxLength == 568 {
            return .iphone5
        }
        else if phone && maxLength == 667 {
            return .iphone6
        }
        else if phone && maxLength == 736 {
            return .iphone6plus
        }
        else if phone && maxLength == 812 {
            return .iphoneX
        }
        return .unknown
    }
}

실제 모습보기
https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

참고 : 예를 들어 iPhone 6이 확대 모드 인 경우 UI는 iPhone 5의 확대 된 버전입니다. 이러한 기능은 장치 유형을 결정하는 것이 아니라 디스플레이 모드이므로이 예에서는 iPhone 5가 원하는 결과입니다.

목표 -C

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)

사용법 : http://pastie.org/9687735

참고 : 예를 들어 iPhone 6이 확대 모드 인 경우 UI는 iPhone 5의 확대 된 버전입니다. 이러한 기능은 장치 유형을 결정하는 것이 아니라 디스플레이 모드이므로이 예에서는 iPhone 5가 원하는 결과입니다.


답변

Swift의 경우 :

struct ScreenSize
{
    static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType
{
    static let IS_IPHONE_4_OR_LESS =  UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
}

답변

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and       iPod touch style UI

#define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)

#define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
#define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
#define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)

#define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
#define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
#define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
#define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )

답변

public extension UIDevice {

    var iPhone: Bool {
        return UIDevice().userInterfaceIdiom == .Phone
    }

    enum ScreenType: String {
        case iPhone4
        case iPhone5
        case iPhone6
        case iPhone6Plus
        case Unknown
    }
    var screenType: ScreenType {
        guard iPhone else { return .Unknown}
        switch UIScreen.mainScreen().nativeBounds.height {
        case 960:
            return .iPhone4
        case 1136:
            return .iPhone5
        case 1334:
            return .iPhone6
        case 1920: //fallthrough
            return .iPhone6Plus
        case 2208:
            return .iPhone6Plus
        default:
            return .Unknown
        }
    }

}

답변

실제 시스템 정보를 가져 오는 클래스를 사용합니다. 모든 장치 유형이 최신인지 확인하기 만하면됩니다.

#import "Macros.h"

@implementation Macros

+ (BOOL)IS_IPHONE_6_PLUS {
    return [[self deviceType] isEqualToString:@"iPhone 6 Plus"] ||  [[self deviceType] isEqualToString:@"iPhone 6S Plus"];
}

+ (BOOL)IS_IPHONE_6 {
    return [[self deviceType] isEqualToString:@"iPhone 6"] || [[self deviceType] isEqualToString:@"iPhone 6S"];
}

+ (BOOL)IS_SIMULATOR {
    return [[self deviceType] isEqualToString:@"32-bit Simulator"]
           || [[self deviceType] isEqualToString:@"64-bit Simulator"];
}

+ (BOOL)IS_IPHONE_5 {
    NSString *device = [self deviceType];
    BOOL result = [device isEqualToString:@"iPhone 5(GSM)"] || [device isEqualToString:@"iPhone 5(GSM+CDMA)"]
                  || [device isEqualToString:@"iPhone 5C(GSM)"] || [device isEqualToString:@"iPhone 5C(GSM+CDMA)"]
                  || [device isEqualToString:@"iPhone 5S(GSM)"] || [device isEqualToString:@"iPhone 5S(GSM+CDMA)"];
    return result;
}

/*
 @"i386"      on 32-bit Simulator
 @"x86_64"    on 64-bit Simulator
 @"iPod1,1"   on iPod Touch
 @"iPod2,1"   on iPod Touch Second Generation
 @"iPod3,1"   on iPod Touch Third Generation
 @"iPod4,1"   on iPod Touch Fourth Generation
 @"iPod5,1"   on iPod Touch Fifth Generation
 @"iPhone1,1" on iPhone
 @"iPhone1,2" on iPhone 3G
 @"iPhone2,1" on iPhone 3GS
 @"iPad1,1"   on iPad
 @"iPad2,1"   on iPad 2
 @"iPad3,1"   on 3rd Generation iPad
 @"iPad3,2":  on iPad 3(GSM+CDMA)
 @"iPad3,3":  on iPad 3(GSM)
 @"iPad3,4":  on iPad 4(WiFi)
 @"iPad3,5":  on iPad 4(GSM)
 @"iPad3,6":  on iPad 4(GSM+CDMA)
 @"iPhone3,1" on iPhone 4
 @"iPhone4,1" on iPhone 4S
 @"iPad3,4"   on 4th Generation iPad
 @"iPad2,5"   on iPad Mini
 @"iPhone5,1" on iPhone 5(GSM)
 @"iPhone5,2" on iPhone 5(GSM+CDMA)
 @"iPhone5,3  on iPhone 5c(GSM)
 @"iPhone5,4" on iPhone 5c(GSM+CDMA)
 @"iPhone6,1" on iPhone 5s(GSM)
 @"iPhone6,2" on iPhone 5s(GSM+CDMA)
 @"iPhone7,1" on iPhone 6 Plus
 @"iPhone7,2" on iPhone 6
 @"iPhone8,1" on iPhone 6
 @"iPhone8,2" on iPhone 6 Plus ...Yes Apple switched the order...
 */

+ (NSString *)deviceType {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *result = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
        // https://www.theiphonewiki.com/wiki/Models
        NSDictionary *matches = @{
                          @"i386" : @"32-bit Simulator",
                          @"x86_64" : @"64-bit Simulator",

                          @"iPod1,1" : @"iPod Touch",
                          @"iPod2,1" : @"iPod Touch Second Generation",
                          @"iPod3,1" : @"iPod Touch Third Generation",
                          @"iPod4,1" : @"iPod Touch Fourth Generation",
                          @"iPod5,1" : @"iPod Touch Fifth Generation",

                          @"iPad1,1" : @"iPad",
                          @"iPad2,1" : @"iPad 2",
                          @"iPad2,2" : @"iPad 2",
                          @"iPad2,3" : @"iPad 2",
                          @"iPad2,4" : @"iPad 2",
                          @"iPad2,5" : @"iPad Mini",
                          @"iPad2,6" : @"iPad Mini",
                          @"iPad2,7" : @"iPad Mini",
                          @"iPad3,1" : @"iPad 3",
                          @"iPad3,2" : @"iPad 3(GSM+CDMA)",
                          @"iPad3,3" : @"iPad 3(GSM)",
                          @"iPad3,4" : @"iPad 4(WiFi)",
                          @"iPad3,5" : @"iPad 4(GSM)",
                          @"iPad3,6" : @"iPad 4(GSM+CDMA)",
                          @"iPad4,1" : @"iPad Air",
                          @"iPad4,2" : @"iPad Air",
                          @"iPad4,3" : @"iPad Air",
                          @"iPad4,4" : @"iPad Mini 2",
                          @"iPad4,5" : @"iPad Mini 2",
                          @"iPad4,6" : @"iPad Mini 2",
                          @"iPad4,7" : @"iPad Mini 3",
                          @"iPad4,8" : @"iPad Mini 3",
                          @"iPad4,9" : @"iPad Mini 3",
                          @"iPad5,1" : @"iPad Mini 4",
                          @"iPad5,2" : @"iPad Mini 4",
                          @"iPad5,3" : @"iPad Air 2",
                          @"iPad5,4" : @"iPad Air 2",
                          @"iPad6,3" : @"iPad Pro (9.7in)",
                          @"iPad6,4" : @"iPad Pro (9.7in)",
                          @"iPad6,7" : @"iPad Pro (12.9in)",
                          @"iPad6,8" : @"iPad Pro (12.9in)",

                          @"iPhone1,1" : @"iPhone",
                          @"iPhone1,2" : @"iPhone 3G",
                          @"iPhone2,1" : @"iPhone 3GS",
                          @"iPhone3,1" : @"iPhone 4",
                          @"iPhone3,3" : @"iPhone 4",
                          @"iPhone4,1" : @"iPhone 4S",
                          @"iPhone5,1" : @"iPhone 5(GSM)",
                          @"iPhone5,2" : @"iPhone 5(GSM+CDMA)",
                          @"iPhone5,3" : @"iPhone 5C(GSM)",
                          @"iPhone5,4" : @"iPhone 5C(GSM+CDMA)",
                          @"iPhone6,1" : @"iPhone 5S(GSM)",
                          @"iPhone6,2" : @"iPhone 5S(GSM+CDMA)",
                          @"iPhone7,1" : @"iPhone 6 Plus",
                          @"iPhone7,2" : @"iPhone 6",
                          @"iPhone8,1" : @"iPhone 6S",
                          @"iPhone8,2" : @"iPhone 6S Plus",
                          @"iPhone8,4" : @"iPhone SE",
                          @"iPhone9,1" : @"iPhone 7",
                          @"iPhone9,3" : @"iPhone 7",
                          @"iPhone9,2" : @"iPhone 7 Plus",
                          @"iPhone9,4" : @"iPhone 7 Plus",
                          };

    if (matches[result]) {
        return matches[result];
    } else {
        return result;
    }
}

@end

답변

실행 화면을 설정하면 버그가 사라진 것을 확인할 수 있습니다.

실행 이미지를 유지하고 MainStoryboard를 Launch Screen에 추가하면 시뮬레이터가 장치를 올바르게 인식했습니다.


답변

코드를 장치 유형과 바인딩하지 않는 것이 좋습니다. 이것은 융통성이없는 복잡한 것으로 이어질 것입니다. Apple은 기기가 아닌 크기에 대해 생각하기를 바랍니다. 이미지 또는 글꼴 크기와 같이 iPhone 5보다 큰 장치에 대한 특수 크기가 필요한 경우 iPhone 5 화면 간의 관계에 따라 기본 크기를 일정 비율로 늘리는 승수를 사용하여 정규화 클래스를 만드는 것이 좋습니다. 너비 및 현재 장치 크기.

let BaseWidth : CGFloat = 320

class Normalizer: NSObject {
    //scale value proportional to the screen width
    class func normalize(value:CGFloat,multiplier : CGFloat = 1,maxDelta:CGFloat = 1024) -> CGFloat{
        let screenWidth = UIScreen.mainScreen().bounds.size.width
        let percent = (screenWidth - BaseWidth)/screenWidth
        let normalizedValue = value * (1 + percent) * multiplier
        return min(normalizedValue, value + maxDelta)//capped by a max value if needed
    }
}

따라서 코드에서 다음과 같이 할 것입니다.

value = Normalizer.normalize(30)