в iPhone App Как определить разрешение экрана устройства

130

В приложении iPhone, при запуске приложения на устройстве. Как определить разрешение экрана устройства, на котором запущено приложение?

ИОС
источник

Ответы:

349
CGRect screenBounds = [[UIScreen mainScreen] bounds];

Это даст вам полное разрешение экрана в пунктах, поэтому для iPhone это обычно будет 320x480. Несмотря на то, что iPhone4 имеет гораздо больший размер экрана, iOS по-прежнему возвращает 320x480 вместо 640x960. Это в основном из-за взлома старых приложений.

CGFloat screenScale = [[UIScreen mainScreen] scale];

Это даст вам масштаб экрана. Для всех устройств, которые не имеют дисплеев Retina, это вернет 1.0f, в то время как устройства Retina Display дадут 2.0f, а iPhone 6 Plus (Retina HD) даст 3.0f.

Теперь, если вы хотите получить ширину и высоту экрана устройства iOS, вам нужно сделать одну простую вещь.

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);

Умножая на масштаб экрана, вы получаете фактическое разрешение в пикселях.

Хорошее чтение о разнице между точками и пикселями в iOS можно прочитать здесь .

РЕДАКТИРОВАТЬ: (Версия для Swift)

let screenBounds = UIScreen.main.bounds
let screenScale = UIScreen.main.scale
let screenSize = CGSize(width: screenBounds.size.width * screenScale, height: screenBounds.size.height * screenScale)
Джеймс Линнелл
источник
4
За исключением того, что это не совсем «фактическое пиксельное» разрешение в случае iPhone 6 Plus. Это решение все будет вынесен на (кроме OpenGL) в коде, с масштабом 3x, но затем , что с понижением пробы внутри с нативным разрешением экрана 1080 х 1920. Один из многих хороших объяснений по ссылке
RobP
К сожалению, это не даст вам «истинных» размеров элементов на экране, поскольку представления Apple о «точках» и «масштабе» являются лишь приблизительными. (См. Спецификации iPhone против iPad против iPad mini.) Предположительно, чтобы уменьшить количество различных комбинаций, которые существуют. Я думаю, что iPhone 6 Plus особенно далеко.
ToolmakerSteve
На самом деле 6+ не так уж и далеко: высота 736 точек / 160 (pt / in) = 4,60 "логическая высота; фактическая высота экрана 4,79"; Ошибка 5%. iPad намного дальше: высота 1024 пт / 160 (пт / дюйм) = 6,40 "логическая высота; фактическая высота экрана 7,76"; Ошибка 20%. iPad mini в порядке; это соответствует оригинальной плотности iPhone. В большинстве случаев это означает, что нужно протестировать программное обеспечение iPad на iPad mini (чтобы убедиться, что оно пригодно для использования), а затем просто игнорировать тот факт, что большинство iPad увеличивают изображение на 20% (по сравнению с iPhone или iPad mini).
ToolmakerSteve
1
@RobP, так как вы решаете это для iPhone 6 Plus?
Crashalot
1
@Crashalot не уверен, что вы подразумеваете под «решить это»? Это зависит от цели, которую вы имеете в виду, когда получаете разрешение экрана. Что касается программистов, ответ Jman012 правильный, и вы рендеритесь в пространство 1242x2208 или 2208x1242. Черт возьми, это даже разрешение, которое мы предоставляем при запуске изображений. Тот факт, что аппаратные средства затем отбирают это изображение и отображает его на физическом экране с меньшим количеством пикселей, будет «деталью реализации», о которой наш код даже не должен знать.
RobP
21

Класс UIScreen позволяет найти разрешение экрана в точках и пикселях.

Разрешение экрана измеряется в точках или пикселях. Это никогда не следует путать с размером экрана. Меньший размер экрана может иметь более высокое разрешение.

'Bounds.width' UIScreen возвращает прямоугольный размер в точках введите описание изображения здесь

«NativeBounds.width» UIScreen возвращает прямоугольный размер в пикселях. Это значение определяется как PPI (точка на дюйм). Показывает четкость и четкость изображения на устройстве. введите описание изображения здесь

Вы можете использовать класс UIScreen, чтобы обнаружить все эти значения.

Swift3

// Normal Screen Bounds - Detect Screen size in Points.
let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
print("\n width:\(width) \n height:\(height)")

// Native Bounds - Detect Screen size in Pixels.
let nWidth = UIScreen.main.nativeBounds.width
let nHeight = UIScreen.main.nativeBounds.height
print("\n Native Width:\(nWidth) \n Native Height:\(nHeight)")

Приставка

width:736.0 
height:414.0

Native Width:1080.0 
Native Height:1920.0

Swift 2.x

//Normal Bounds - Detect Screen size in Points.
    let width  = UIScreen.mainScreen.bounds.width
    let height = UIScreen.mainScreen.bounds.height

// Native Bounds - Detect Screen size in Pixels.
    let nWidth  = UIScreen.mainScreen.nativeBounds.width
    let nHeight = UIScreen.mainScreen.nativeBounds.height

ObjectiveC

// Normal Bounds - Detect Screen size in Points.
CGFloat *width  = [UIScreen mainScreen].bounds.size.width;
CGFloat *height = [UIScreen mainScreen].bounds.size.height;

// Native Bounds - Detect Screen size in Pixels.
CGFloat *width  = [UIScreen mainScreen].nativeBounds.size.width
CGFloat *height = [UIScreen mainScreen].nativeBounds.size.width
Таймур Аджмал
источник
8

Используйте его в App Delegate: я использую раскадровку

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    //----------------HERE WE SETUP FOR IPHONE 4/4s/iPod----------------------

    if(iOSDeviceScreenSize.height == 480){          

        UIStoryboard *iPhone35Storyboard = [UIStoryboard storyboardWithName:@"iPhone" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone35Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

        iphone=@"4";

        NSLog(@"iPhone 4: %f", iOSDeviceScreenSize.height);

    }

    //----------------HERE WE SETUP FOR IPHONE 5----------------------

    if(iOSDeviceScreenSize.height == 568){

        // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
        UIStoryboard *iPhone4Storyboard = [UIStoryboard storyboardWithName:@"iPhone5" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone4Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

         NSLog(@"iPhone 5: %f", iOSDeviceScreenSize.height);
        iphone=@"5";
    }

} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // NSLog(@"wqweqe");
    storyboard = [UIStoryboard storyboardWithName:@"iPad" bundle:nil];

}

 return YES;
 }
ios_av
источник
5

Для iOS 8 мы можем просто использовать это [UIScreen mainScreen].nativeBounds, вот так:

- (NSInteger)resolutionX
{
    return CGRectGetWidth([UIScreen mainScreen].nativeBounds);
}

- (NSInteger)resolutionY
{
    return CGRectGetHeight([UIScreen mainScreen].nativeBounds);
}
Буг
источник
4

См. Справку по UIScreen: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScreen_Class/Reference/UIScreen.html.

if([[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"scale")])
{
    if ([[UIScreen mainScreen] scale] < 1.1)
        NSLog(@"Standard Resolution Device");

    if ([[UIScreen mainScreen] scale] > 1.9)
        NSLog(@"High Resolution Device");
}
Constantin
источник
спасибо за ответ, если я помещаю его в NSLog (@ "% d", [[UIScreen mainScreen] scale]); дает 0 ...... и NSLog (@ "% @", [[UIScreen mainScreen] масштаб]); он дает nil. Пожалуйста, дайте мне знать, как получить разрешение экрана или как проверить, дает ли оно правильное разрешение при запуске на симуляторе
iOS
2
tryNSLog(@"%f",[[UIScreen mainScreen] scale]);
vikingosegundo
0

Используйте этот код, он поможет получить разрешение экрана любого типа устройства.

 [[UIScreen mainScreen] bounds].size.height
 [[UIScreen mainScreen] bounds].size.width
Шахзаиб Макбул
источник