IPhone / IPad: Як програмно отримати ширину екрану?


83

Привіт, мені цікаво, чи є спосіб отримати ширину програмно.

Я шукаю щось досить загальне для розміщення iphone 3gs, iphone 4, ipad. Крім того, ширина повинна змінюватися залежно від того, чи є пристрій книжковим або альбомним (для ipad).

Хто-небудь знає, як це зробити ?? Я шукав якийсь час ... дякую!


Ширина екрану, ширина доступного простору програми (без системної панелі) або ширина певного виду, який ви шукаєте?
VdesmedT

hrmm я не впевнений. Я думаю, я просто хотів ширину пристрою (тобто в ipad 768 для портретної ширини і 1024 для альбомної ширини), але self.view.bounds здавалося, це задовольняє. див. мій коментар нижче
foreyez

Дивіться цю більш вичерпну відповідь, яка враховує орієнтацію пристрою.
Дрю Стівенс,

@DrewStephens Див. Мою відповідь нижче, яка враховує орієнтацію і містить лише 3 рядки коду: D.
memmons

Відповіді:


204

Погляньте на UIScreen .

напр.

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

Погляньте на властивість applicationFrame, якщо ви не хочете, щоб рядок стану був включений (це не вплине на ширину).

ОНОВЛЕННЯ: Виявляється, UIScreen (-bounds або -applicationFrame) не враховує поточну орієнтацію інтерфейсу. Більш правильним підходом було б запитати ваш UIView про його межі - припускаючи, що цей UIView був автоматично обертаний його контролером View.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGFloat width = CGRectGetWidth(self.view.bounds);
}

Якщо подання не обертається автоматично контролером перегляду, вам потрібно буде перевірити орієнтацію інтерфейсу, щоб визначити, яка частина меж вигляду представляє "ширину" та "висоту". Зверніть увагу, що властивість frame дасть вам прямий вигляд у просторі координат вікна UIWindow, який (за замовчуванням) не враховує орієнтацію інтерфейсу.


3
насправді, це не працює, коли ipad орієнтований альбомно .. тобто, якщо мій симулятор працює в альбомному режимі, він все одно повертає 768 (замість 1024). як ви думаєте, чи повинен я мати оператор if, який перевіряє орієнтацію в цьому випадку, чи є кращий спосіб отримати ширину?
foreyez

Чорт - схоже, ти маєш рацію; Я оновив свою відповідь ще кількома ідеями.
Алан Роджерс

У підсумку я просто використав "CGFloat width = CGRectGetWidth (self.view.bounds);" у моєму методі (немає потреби в didRotateFromInterfaceOrientation) ... так що принаймні self.view.bounds враховує орієнтацію. Дякую!!
foreyez

5
для інших, хто, можливо, натрапив на цю давнішу публікацію, я виявив, що self.view.bounds є лише цілком точним, починаючи з didRotateFromInterfaceOrientation. Це також буде точно в viewDidLoad і viewWillAppear, якщо вигляд відображається у вихідній орієнтації (як зазначено в IB). Якщо подання відображається в іншій орієнтації, тоді націлено, viewDidLoad (і viewWillAppear) викликається перед didRotateFromInterfaceOrientation і view.bound буде неправильним
rimsky

У випадку iOS 6 та коли ми використовуємо модальні контролери, didRotateFromInterfaceOrientation не буде викликано
Крішнан

12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

10
не враховує орієнтацію
Римський

6

Це можна зробити за допомогою 3 рядків коду :

// 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];

3
це близько, але якщо відображається UIAlertView, це буде ключове вікно, а його властивість rootViewController буде нульовим
matt bezark

@mattbezark Правда. Я вважаю це наріжним випадком. Існує альтернатива отримати кореневий вигляд - не такий чистий, як цей, але я опублікую альтернативу на випадок, якщо комусь буде цікаво.
memmons

@memmons трохи запізнився на вечірку, але мене зацікавить ваше альтернативне рішення :)
alexgophermix

0

Станом на iOS 9.0 немає можливості надійно отримати орієнтацію. Це код, який я використовував для програми, яку я розробляю лише для портретного режиму, тому, якщо додаток відкрито в альбомному режимі, він все одно буде точним:

screenHeight = [[UIScreen mainScreen] bounds].size.height;
screenWidth = [[UIScreen mainScreen] bounds].size.width;
if (screenWidth > screenHeight) {
    float tempHeight = screenWidth;
    screenWidth = screenHeight;
    screenHeight = tempHeight;
}


0

використання:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;

-2

Ось швидкий спосіб отримати розміри екрану, він також враховує поточну орієнтацію інтерфейсу:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.