Где UIViewController хранит информацию fromInterfaceOrientation? - PullRequest
0 голосов
/ 25 марта 2012

Мне нужно внести коррективы в слой, когда 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.)

1 Ответ

1 голос
/ 20 апреля 2012

Возможно, вы немного подумаете об этом:)

У меня была похожая проблема;это код, который я использовал для решения проблемы:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    CGSize size = self.view.frame.size;
    CGRect rect;

    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    {
        rect = CGRectMake(0, 0, size.height, size.width);
    } 
    else
    {
        rect = CGRectMake(0, 0, size.width, size.height);
    }

    // Views that need updating        
    clockFaceView.frame = rect;
    hourIndicatorView.frame = rect;
    minuteIndicatorView.frame = rect;
    // Update viewControllers
    [timeInWordsOverlayController updateBoundsWithRect:rect];
    [actionOveralyViewController updateBoundsWithRect:rect];
}

, где updateBoundsWithRect определяется как:

- (void) updateBoundsWithRect:(CGRect)rect
{
    _actionView.frame = rect;
    self.view.frame = rect;
}

Вы загружаете бесплатное приложение и видите результаткод. iTunes ссылка.Надеюсь, это поможет.

...