Как узнать ширину и высоту экрана в iOS?

Как получить размеры экрана в iOS?

В настоящее время я использую:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

в viewWillAppear: и willAnimateRotationToInterfaceOrientation:duration:

Первый раз получаю весь экран размером. Во второй раз я получаю экран минус панель навигации.

вопрос задан 15.04.2011
griotspeak
6287 репутация

16 ответов


  • 1016 рейтинг

    Как получить размеры экрана в iOS?

    Проблема с кодом, который вы разместили, заключается в том, что вы рассчитываете на размер представления, соответствующий размеру экрана, и, как вы видели, это не всегда так. Если вам нужен размер экрана, вы должны посмотреть на объект, который представляет сам экран, например:

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;
    

    Обновление для разделенного вида: В комментариях Дмитрий спросил:

    Как узнать размер экрана в режиме разделения?

    Приведенный выше код сообщает размер экрана, даже в режиме разделенного экрана. Когда вы используете режим разделенного экрана, окно вашего приложения меняется. Если приведенный выше код не дает ожидаемой информации, то, как и OP, вы смотрите не на тот объект. В этом случае, однако, вы должны смотреть на окно, а не на экран, например:

    CGRect windowRect = self.view.window.frame;
    CGFloat windowWidth = windowRect.size.width;
    CGFloat windowHeight = windowRect.size.height;
    
    ответ дан Caleb, с репутацией 106998, 15.04.2011
  • 61 рейтинг

    Осторожно, [UIScreen mainScreen] также содержит строку состояния, если вы хотите получить фрейм для вашего приложения (исключая строку состояния), вы должны использовать

    + (CGFloat) window_height   {
        return [UIScreen mainScreen].applicationFrame.size.height;
    }
    
    + (CGFloat) window_width   {
        return [UIScreen mainScreen].applicationFrame.size.width;
    }
    
    ответ дан Ege Akpinar, с репутацией 2586, 22.11.2012
  • 39 рейтинг

    Я использовал эти удобные методы раньше:

    - (CGRect)getScreenFrameForCurrentOrientation {
        return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
    }
    
    - (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {
    
        CGRect fullScreenRect = [[UIScreen mainScreen] bounds];
    
        // implicitly in Portrait orientation.
        if (UIInterfaceOrientationIsLandscape(orientation)) {
          CGRect temp = CGRectZero;
          temp.size.width = fullScreenRect.size.height;
          temp.size.height = fullScreenRect.size.width;
          fullScreenRect = temp;
        }
    
        if (![[UIApplication sharedApplication] statusBarHidden]) {
          CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
          fullScreenRect.size.height -= statusBarHeight;
        }
    
        return fullScreenRect;
    } 
    
    ответ дан Luke Mcneice, с репутацией 2408, 5.03.2012
  • 38 рейтинг

    Я перевел некоторые из приведенных выше ответов Objective C на код Swift. Каждый перевод сопровождается ссылкой на оригинальный ответ.

    Основной ответ

    let screen = UIScreen.main.bounds
    let screenWidth = screen.size.width
    let screenHeight = screen.size.height
    

    Простой ответ функции

    func windowHeight() -> CGFloat {
        return UIScreen.mainScreen().applicationFrame.size.height
    }
    
    func windowWidth() -> CGFloat {
        return UIScreen.mainScreen().applicationFrame.size.width
    }
    

    Ориентация устройства Ответ

    var screenHeight : CGFloat
    let statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation
    // it is important to do this after presentModalViewController:animated:
    if (statusBarOrientation != UIInterfaceOrientation.Portrait
        && statusBarOrientation != UIInterfaceOrientation.PortraitUpsideDown){
        screenHeight = UIScreen.mainScreen().applicationFrame.size.width
    } else {
        screenHeight = UIScreen.mainScreen().applicationFrame.size.height
    }
    

    Журнал Ответ

    let screenWidth = UIScreen.mainScreen().bounds.size.width
    let screenHeight = UIScreen.mainScreen().bounds.size.height
    println("width: \(screenWidth)")
    println("height: \(screenHeight)")
    
    ответ дан Martin Woolstenhulme, с репутацией 2850, 14.12.2014
  • 15 рейтинг

    Я понимаю, что это старый пост, но иногда я нахожу его полезным для #define констант, подобных этим, поэтому мне не нужно об этом беспокоиться:

    #define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size
    

    Приведенная выше константа должна возвращать правильный размер независимо от ориентации устройства. Тогда получить размеры так же просто, как:

    lCurrentWidth = DEVICE_SIZE.width;
    lCurrentHeight = DEVICE_SIZE.height;
    
    ответ дан A Random User, с репутацией 168, 6.08.2013
  • 13 рейтинг

    Очень, очень легко получить ваше устройство размером , а также с учетом ориентации:

    // grab the window frame and adjust it for orientation
    UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
                                       rootViewController].view;
    CGRect originalFrame = [[UIScreen mainScreen] bounds];
    CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil];
    
    ответ дан memmons, с репутацией 34297, 29.03.2013
  • 9 рейтинг

    Также необходимо учитывать ориентацию устройства:

    CGFloat screenHeight;
    // it is important to do this after presentModalViewController:animated:
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
        screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
    }
    else{
        screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
    }
    
    ответ дан Oleh Kudinov, с репутацией 1669, 4.10.2013
  • 8 рейтинг
    NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.width);
    NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.height);
    
    ответ дан Gaurav Gilani, с репутацией 1550, 17.05.2014
  • 4 рейтинг

    Здесь я обновил для Swift 3

    applicationFrame устарел из iOS 9

    В три быстрых они удалили (), и они изменили несколько соглашений об именах, вы можете обратиться сюда Ссылка

    func windowHeight() -> CGFloat {
        return UIScreen.main.bounds.size.height
    }
    
    func windowWidth() -> CGFloat {
        return UIScreen.main.bounds.size.width
    }
    
    ответ дан karthikeyan, с репутацией 2746, 16.11.2016
  • 3 рейтинг

    Если вы хотите ширину / высоту экрана независимо от ориентации устройства (подходит для определения размера только портретных контроллеров представления, запускаемых из альбомной ориентации):

    CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
    CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;
    

    [UIScreen mainScreen]. nativeBounds & lt; - из документов - & gt; Ограничительный прямоугольник физического экрана, измеряется в пикселях. Этот прямоугольник основан на устройстве в портретной ориентации. Это значение не изменяется при вращении устройства.

    ответ дан John Erck, с репутацией 7089, 18.11.2016
  • 2 рейтинг

    Используйте эти Structs, чтобы узнать полезную информацию о текущем устройстве в Swift 3. 0

    struct ScreenSize { // Answer to OP's question
    
        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 { //Use this to check what is the device kind you're working with
    
        static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
        static let IS_IPHONE_SE         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
        static let IS_IPHONE_7          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
        static let IS_IPHONE_7PLUS      = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
        static let IS_IPHONE_X          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
        static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
    
    }
    
    
    struct iOSVersion { //Get current device's iOS version
    
        static let SYS_VERSION_FLOAT  = (UIDevice.current.systemVersion as NSString).floatValue
        static let iOS7               = (iOSVersion.SYS_VERSION_FLOAT >= 7.0 && iOSVersion.SYS_VERSION_FLOAT < 8.0)
        static let iOS8               = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0)
        static let iOS9               = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0)
        static let iOS10              = (iOSVersion.SYS_VERSION_FLOAT >= 10.0 && iOSVersion.SYS_VERSION_FLOAT < 11.0)
        static let iOS11              = (iOSVersion.SYS_VERSION_FLOAT >= 11.0 && iOSVersion.SYS_VERSION_FLOAT < 12.0)
        static let iOS12              = (iOSVersion.SYS_VERSION_FLOAT >= 12.0 && iOSVersion.SYS_VERSION_FLOAT < 13.0)
    
    }
    
    ответ дан Badhan Ganesh, с репутацией 2381, 18.05.2017
  • 2 рейтинг

    Вот быстрый способ получить размеры экрана:

    print(screenWidth)
    print(screenHeight)
    
    var screenWidth: CGFloat {
        if UIInterfaceOrientationIsPortrait(screenOrientation) {
            return UIScreen.mainScreen().bounds.size.width
        } else {
            return UIScreen.mainScreen().bounds.size.height
        }
    }
    
    var screenHeight: CGFloat {
        if UIInterfaceOrientationIsPortrait(screenOrientation) {
            return UIScreen.mainScreen().bounds.size.height
        } else {
            return UIScreen.mainScreen().bounds.size.width
        }
    }
    
    var screenOrientation: UIInterfaceOrientation {
        return UIApplication.sharedApplication().statusBarOrientation
    }
    

    Они включены как стандартная функция в:

    https: // github. com / goktugyil / EZSwiftExtensions

    ответ дан Esqarrouth, с репутацией 23312, 24.11.2015
  • 1 рейтинг

    CGFloat width = [[UIScreen mainScreen] bounds].size.width; CGFloat height = [[UIScreen mainScreen]bounds ].size.height;

    ответ дан Himanshu jamnani, с репутацией 231, 4.04.2016
  • 1 рейтинг

    Современный ответ:

    Если ваше приложение поддерживает разделенное представление на iPad, эта проблема становится немного сложнее. Вам нужен размер окна, а не экран, который может содержать 2 приложения. Размер окна также может меняться во время работы.

    Использовать размер главного окна приложения:

    UIApplication.shared.delegate?.window??.bounds.size ?? .zero
    

    Примечание. Приведенный выше метод может получить неправильное значение, прежде чем окно станет ключевым при запуске. если вам нужна только ширина, метод ниже рекомендуется :

    UIApplication.shared.statusBarFrame.width
    

    Старое решение с использованием UIScreen.main.bounds вернет границы устройства. Если ваше приложение работает в режиме разделенного просмотра, оно получит неправильные размеры.

    self.view.window в самом горячем ответе может иметь неправильный размер, когда приложение содержит 2 или более окон, а окно имеет небольшой размер.

    ответ дан leavez, с репутацией 861, 11.07.2017
  • 0 рейтинг

    swift 3. 0

    для ширины

    UIScreen.main.bounds.size.width
    

    для высоты

    UIScreen.main.bounds.size.height
    
    ответ дан Rob-4608, с репутацией 764, 19.05.2017
  • -2 рейтинг

    Вы можете поместить эти макросы в файл pch и использовать их в любом месте проекта, используя «SCREEN_WIDTH»

    #define SCREEN_WIDTH                ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height)
    

    и "SCREEN_HEIGHT"

    #define SCREEN_HEIGHT               ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation ==   UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width)
    

    Пример использования:

    CGSize calCulateSizze ;
    calCulateSizze.width = SCREEN_WIDTH/2-8;
    calCulateSizze.height = SCREEN_WIDTH/2-8;
    
    ответ дан Anny, с репутацией 309, 10.11.2015