Неправильный размер кадра iOS с классами размера

Я использую xCode 6 и классы размеров для своего приложения.

Я встречаю очень странную проблему, которую я не понимаю.

У меня есть UIView, который ограничивает UIViewController, я устанавливаю ограничение ширины для класса размера Any x Any (150x150) и другое ограничение ширины для Regular x Regular (300x300).

Когда я регистрирую размер моего UIView, когда приложение работает на iPad, я сталкиваюсь с проблемой.

Действительно, в «viewWillAppear», «viewWillLayoutSubviews» или «viewDidLayoutSubviews» я получаю размер «150x150» вместо «300x300».

Мои журналы:

- (void) viewWillAppear:(BOOL)animated {
    NSLog(@"viewWillAppear Size %f - %f",         
    self.myView.frame.size.width, self.myView.frame.size.height);
}

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];
    NSLog(@"viewDidAppear Size %f - %f",     
   self.myView.frame.size.width, self.myView.frame.size.height);
  }

 - (void) viewWillLayoutSubviews {
     [super viewWillLayoutSubviews];
     NSLog(@"viewWillLayoutSubviews Size %f - %f",   
     self.myView.frame.size.width, self.myView.frame.size.height);
 }

 - (void) viewDidLayoutSubviews {
     [super viewDidLayoutSubviews];
     NSLog(@"viewDidLayoutSubviews Size %f - %f",     
     self.myView.frame.size.width, self.myView.frame.size.height);
 }

Что я не понимаю, так это то, что журналы показывают:

2015-02-17 09:29:38.984 myApp[660:42565] viewDidLoad Size   
150.000000 - 150.000000

2015-02-17 09:29:38.985 myApp[660:42565] viewWillAppear Size    
150.000000 - 150.000000

2015-02-17 09:29:39.047 myApp[660:42565] viewWillLayoutSubviews 
Size 150.000000 - 150.000000

2015-02-17 09:29:39.058 myApp[660:42565] viewDidLayoutSubviews 
Size 150.000000 - 150.000000

2015-02-17 09:29:39.063 myApp[660:42565] viewWillLayoutSubviews  
Size 230.000000 - 230.000000

2015-02-17 09:29:39.063 myApp[660:42565] viewDidLayoutSubviews 
Size 230.000000 - 230.000000

2015-02-17 09:29:39.586 myApp[660:42565] viewDidAppear Size 
230.000000 - 230.000000

2015-02-17 09:29:39.591 myApp[660:42565] viewWillLayoutSubviews 
Size 230.000000 - 230.000000

2015-02-17 09:29:39.593 myApp[660:42565] viewDidLayoutSubviews  
Size 230.000000 - 230.000000

Так что же происходит? Почему в первый раз я получаю размер класса Any x Any size? И почему эти методы вызываются много раз?

Я вижу, что у меня есть правильный размер кадра в viewDidAppear, но мне это не нравится, потому что есть задержка перед вызовом этой функции. (Мне нужно что-то сделать с размером кадра моего представления, прежде чем показывать его....)


person deveLost    schedule 17.02.2015    source источник
comment
size не является классом. Ваша проблема связана с ограничениями, а не со структурой размера.   -  person Hermann Klecker    schedule 17.02.2015
comment
@Hermann Я не думаю, что он имел в виду свойство UIViews size как экземпляр класса, а просто использовал его для целей отладки, и вопрос связан с size classes, поскольку в IB настроено как минимум два из них, и они не не работает, как ожидалось.   -  person A-Live    schedule 17.02.2015
comment
@A-Live, теперь, когда ты упомянул об этом...   -  person Hermann Klecker    schedule 17.02.2015
comment
Да, я говорю о размерах классов.   -  person deveLost    schedule 17.02.2015


Ответы (2)


«Временное» (но красивое дерьмо: D) решение:

В viewDidLoad я добавил:

if(UIDEVICE == IPAD) {
    [self.view layoutIfNeeded];
}

При этом у меня правильный размер кадра, но я хочу понять, в чем проблема с моим кодом, размерными классами и т. д. :(

person deveLost    schedule 18.02.2015
comment
В конце концов, это было мое решение для моего Custom UIImageView с использованием классов размеров, вот мой код. И это работает. Но, как вы говорите, было бы неплохо иметь объяснение, почему в некоторых методах мы получаем значение класса размера Any Any Any. И мне не пришлось вызывать метод layoutIfNeeded :) - person Anel Rojas Hernández; 20.02.2015
comment
новости об этой проблеме? :D - person deveLost; 27.04.2016

Если вы хотите изменить размер UIView в соответствии с автоматическим макетом до - (void) viewWillAppear:(BOOL)animated, попробуйте следующий способ.

    - (void) viewWillAppear:(BOOL)animated {

        [self.view layoutIfNeeded];
        [self.myView layoutIfNeeded];

        NSLog(@"viewWillAppear Size %f - %f",         
        self.myView.frame.size.width, self.myView.frame.size.height);
    }
person DilumN    schedule 17.02.2015
comment
Да, я делаю так: if(UIDEVICE == IPAD) { [self.view layoutIfNeeded]; } но я думаю, что это не нормально... - person deveLost; 18.02.2015