IPhone / IPad: Как программно получить ширину экрана?


83

Привет, мне интересно, есть ли способ получить ширину программно.

Я ищу что-то достаточно общее, чтобы разместить iphone 3gs, iphone 4, ipad. Кроме того, ширина должна меняться в зависимости от того, находится ли устройство в портретной или альбомной ориентации (для iPad).

Кто-нибудь знает, как это сделать ?? Давно искал ... спасибо!


Что вам нужно - это ширина экрана, ширина доступного пространства приложения (без системной панели) или ширина конкретного представления?
VdesmedT

хммм, я не уверен. Я думаю, мне просто нужна была ширина устройства (например, в ipad 768 для портретной ширины и 1024 для ландшафтной ширины), но self.view.bounds, похоже, удовлетворил это. мой комментарий ниже
Shai UI

См. Более подробный ответ , учитывающий ориентацию устройства.
Дрю Стивенс

@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, который проверяет ориентацию в этом случае, или есть лучший способ получить ширину?
Shai UI,

Блин - похоже, вы правы; Я добавил в свой ответ еще несколько идей.
Алан Роджерс

В итоге я просто использовал «CGFloat width = CGRectGetWidth (self.view.bounds);» в моем методе (нет необходимости в didRotateFromInterfaceOrientation) ... поэтому по крайней мере self.view.bounds учитывает ориентацию. благодаря!!
Shai UI,

5
для других, кто, возможно, наткнулся на этот старый пост, я обнаружил, что self.view.bounds является полностью точным только начиная с didRotateFromInterfaceOrientation. Он также будет точным в viewDidLoad и viewWillAppear, если представление отображается в исходной целевой ориентации (как указано в IB). Если представление отображается в ориентации, отличной от целевой, viewDidLoad (и viewWillAppear) вызывается до didRotateFromInterfaceOrientation и view.bounds будет неверным
rimsky

В случае iOS 6 и когда мы используем модальные контроллеры, didRotateFromInterfaceOrientation не будет вызываться
Кришнан

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

10
не учитывает ориентацию
Римский

6

Это можно сделать в трех строках кода :

// 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 будет равно нулю
Мэтт Безарк 02

@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;
}



-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.