Почему iOS автоматически не загружает представление, загруженное из пера после того, как оно было выпущено didReceiveMemoryWarning? - PullRequest
5 голосов
/ 11 января 2011

В моем приложении для iPad интенсивно используется автоповорот.Это замечательно.Однако я заметил, что если скрытое представление освобождается реализацией по умолчанию didReceiveMemoryWarning (как описано здесь ), когда представление перезагружается с пера, и я оказываюсь в альбомнойгрузит его в портрет.Это портит интерфейс, пока я не поверну iPad вручную и не заставлю его перейти в правильную ориентацию.

Я предполагал, что iOS загрузит вид в текущей ориентации;это то, что он делает, когда приложение запускается.Но нет, не после выгрузки didReceiveMemoryWarning.Почему бы и нет?И как мне заставить это сделать?

Ответы [ 2 ]

4 голосов
/ 12 января 2011

Ответ, определенный благодаря указателям из dbarker , заключается в том, что методы поворота контроллера представления, включая -willRotateToInterfaceOrientation:duration: и -willAnimateRotationToInterfaceOrientation:duration:, не будут вызываться при перезагрузке представления после реализации по умолчанию из didReceiveMemoryWarning выгрузил вид. Я понятия не имею, почему это будет отличаться при запуске приложения, но у меня есть обходной путь

Я установил логический ивар с именем unloadedByMemoryWarning на YES в didReceiveMemoryWarning, например:

- (void) didReceiveMemoryWarning {
    unloadedByMemoryWarning = YES;
    [super didReceiveMemoryWarning];
}

Затем, в viewDidLoad, если этот флаг равен true, я устанавливаю его на NO, а затем сам вызываю методы ротации:

if (unloadedByMemoryWarning) {
    unloadedByMemoryWarning = NO;
    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
    [self willAnimateRotationToInterfaceOrientation:self.interfaceOrientation duration:0];
    [self didRotateFromInterfaceOrientation:self.interfaceOrientation];
}

Что-то вроде отстранения, что я должен это сделать, но это работает, и теперь я меньше беспокоюсь о том, чтобы меня убило iOS за использование слишком большого количества памяти.

1 голос
/ 05 января 2012
  1. Я думаю, что iOS 5 может это исправить.

  2. Для iOS 4.3 мне повезло с другим исправлением.После загрузки из пера:

    [parent.view addSubview:nibView];  
    nibView.frame = parent.view.frame;  
    [nibView setNeedsLayout];  
    

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

...