Мне нужно внести коррективы в слой, когда iPhone поворачивается, но только если он поворачивается из портретной в альбомную или наоборот. Мне ничего не нужно делать, если он повернут с альбомного на 180 градусов в альбомный или вправо или из вертикального на 180 градусов в вертикальный портрет в вертикальном положении.
Поэтому, чтобы избежать ненужных действий, я запускаю такой тест (self
- это контроллер вида):
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
BOOL bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);
if (bFromPortrait != bToPortrait)
// make adjustments
}
Что не работает, поскольку к тому времени, когда вызывается willAnimate
, self.interfaceOrientation
уже был изменен, чтобы отразить новую ориентацию, поэтому bFromPortrait и bToPortrait всегда одинаковы, и корректировки никогда не происходят.
Итак, я попытался запустить этот код из willRotate
, после чего «свойство interfaceOrientation по-прежнему содержит исходную ориентацию представления». Но в этот момент настройки автоматического изменения размера представления хоста слоя еще не были выполнены, поэтому я никак не могу чтобы получить доступ к кадру с автоматическим изменением размера, который он будет иметь для ориентации цели, без которого я не могу вносить свои корректировки.
Поэтому я добавил логическое свойство bFromPortrait
, чтобы отслеживать ориентацию iPhone, установил его в willRotate
и получил доступ к willAnimate
(это работает):
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
self.bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
if (self.bFromPortrait != bToPortrait)
// Make adjustments.
}
Но я заметил, что если я переопределил didRotateFromInterfaceOrientation
, его аргумент fromInterfaceOrientation
правильно отобразит источник iPhone, даже если этот метод называется после других. Так что дополнительное логическое свойство bFromPortrait
не должно быть необходимым; UIViewController уже отслеживает эту информацию - но где? Как мне получить к нему доступ?
(Вы можете спросить, почему бы не внести коррективы в didRotateFromInterfaceOrientation
. Проблема в том, что этот метод запускается после анимации, поэтому корректировки привязываются. Чтобы корректировки были включены в анимацию, они должны происходить в willAnimate
.)