Self.view.bounds.size.width возвращает неправильное значение

Сейчас я столкнулся с очень странной проблемой. Получение [[self view] bounds].size.width всегда 320 не меняется в зависимости от устройства. iPhone 5, 6 и 6 Plus для всех он возвращает 320.000000 ниже всех методов.

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}

Выход

2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000 
2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000
2015-02-11 14:48:03.783 MyApp[2948:86285] 320.000000

Даже экран заставки также присутствует.

Как я могу получить фактический размер представления?

Ответ 1

Используйте

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

вместо

NSLog(@"%f", [[self view] bounds].size.width);

Он дает ожидаемое значение w/h.

Ответ 2

Если вы попытаетесь прочитать [[self view] bounds].size.width значение в -(void) viewWillAppear:(BOOL)animated, вы увидите, что оно отобразит правильное значение.

В - (void)viewDidLoad [[self view] bounds].size.width будет отображаться точный дизайн, который у вас есть в файле .xib.

Ниже приведены примеры и результаты NSLog.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"%f",[[self view] bounds].size.width);

}
-(void) viewWillAppear:(BOOL)animated{
    NSLog(@"%f",[[self view] bounds].size.width);
    [testIndicator startAnimatingInView:self.view];
}

Соответственно результаты:

2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000

Ответ 3

Это происходит, поскольку вам не хватает файла запуска для iPhone 6 и 6 Plus. Попробуйте один из этих двух подходов:

  • В Xcode перейдите к своей цели, в общем и добавьте туда экран запуска ( "Основной" ).
  • Если вы используете каталоги активов, перейдите в каталог активов LaunchImages и добавьте новые стартовые изображения для двух новых iPhones. Вам может потребоваться щелкнуть правой кнопкой мыши и выбрать "Добавить новое изображение запуска", чтобы увидеть место для добавления новых изображений.

Для iPhone 6 (Retina HD 4.7) требуется изображение для запуска с портретом 750 x 1334. IPhone 6 Plus (Retina HD 5.5) требует как портретных, так и ландшафтных изображений размером 1242 x 2208 и 2208 x 1242 соответственно.

Ответ 4

Совершенно необходимо, чтобы вы добавляли образ запуска подходящего размера для iPhone 6 и iPhone 6 Plus. В противном случае эти устройства будут растягивать ширину 320 точек на весь экран. Таким образом, вы получите 320 сообщений в виде ширины. С изображением запуска вы получите 475 или 414, которые будут указаны как ширина.

Ответ 6

Можете ли вы выполнить тест, просто создав новый тестовый проект и просто напишите ниже трех операторов журнала внутри метода viewDidLoad ViewController, например:

- (void)viewDidLoad {
    NSLog(@"screens = %@", [UIScreen screens]);
    NSLog(@"self.frame= %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
    NSLog(@"self.view.frame= %@", NSStringFromCGRect(self.view.frame));
}

Сборка и запуск - вы получите фактическое разрешение устройства/экрана/представления

Пример вывода -

2015-02-11 12:45:19.116 Test[1558:87057] screens = (
    "<UIScreen: 0x7ff0b970bcc0; bounds = {{0, 0}, {375, 667}}; mode = <UIScreenMode: 0x7ff0b961b500; size = 750.000000 x 1334.000000>>"
)
2015-02-11 12:45:19.117 Test[1558:87057] self.frame= {{0, 0}, {375, 667}}
2015-02-11 12:45:19.117 Test[1558:87057] self.view.frame= {{0, 0}, {375, 667}}

Ответ 7

Я также сталкиваюсь с той же проблемой, с которой вы столкнулись. Я думаю, что ваш viewcontroller имеет ширину 320. После загрузки вашего вида просмотрите один метод после некоторой задержки, а затем получите рамку просмотра или просмотр. Вы получаете правильную рамку.

-(void)viewDidLoad
{
    [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(getMyFrame) userInfo:nil repeats:NO];
    [super viewDidLoad];
}
-(void)getMyFrame
{
    NSLog(@"%f", [[self view] bounds].size.width);
}

Ответ 8

Представление связанной задачи в viewWillLayoutSubviews() метод

 override func viewWillLayoutSubviews() {
    print("view Size: \(view.bounds.width)")
}

Ответ 9

Вам следует больше полагаться на границы экрана по нескольким причинам. Они вернут точное значение для разных устройств.

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

Ответ 10

Использовать метод viewDidLayoutSubviews

Ответ 11

Использование:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}