Панель панели инструментов UinaviggationController и ориентация устройства (вращение)

StackOverflow https://stackoverflow.com/questions/3848255

Вопрос

Поэтому у меня есть это приложение для iPhone с вложенной настройкой, как это: [rootViewController] -> [UITABBACCONTROLLER] -> [UinavigationController] -> [SubViewControllers]. Все построено программно, не в интерфейсе.

Я просто пытаюсь поддержать все ориентации устройства. Все мои автосалонные маски устанавливаются, и все вращается и расширяется / контракты по мере необходимости. Все, кроме Navbar и панели инструментов NaviGateController. (Обычно это представления автоматически разместится автоматически в зависимости от ориентации. То есть в ландшафте, NAVBAR и панель инструментов должны автоматически разместиться в режиме около 32 пикселей, а 44Px в режиме PORTORAI.) Что такое особенное, что подвыраживание навигационного контроллера изменяется, но Фактическая навка и панель инструментов нет. Другими словами, содержание растягивается / сжимается около 12 px или около того, в какое направление, как будто навка и панель инструментов изменяются. Похоже, это автосалонные маски, выполняющие свою работу.

Таким образом, чтобы попытаться решить эту ситуацию, я создал категорию для UinavigatingController, которая отвечает на «WillrotateTetterfactorfactorentation: продолжительность:», чтобы вызвать селектор «Sizetofit». (Эта техника пришла из другого поста на переполнении стека, с подобной проблемой.) Я обнаружил, что в моих исследованиях, что только внешний контроллер просмотра принимает это сообщение, поэтому у меня есть мой контроллер Root View, который позвонит этому на вкладке Controler, который В свою очередь называет его на NAV контроллере и т. Д. Это позаботилось о этой проблеме, и теперь мои контроллеры вложенного представления уведомляются, когда внешний вид вращается. Использование методики SizeToFit, оба навигационной панели, так и на панели инструментов на сайте размераются. Однако это по-прежнему оставляет проблему перемещения панели инструментов, чтобы составить смещение от изменения размера. (Поскольку координаты нашего просмотра в iPhone начинаются в верхнем левом углу.)

Что делает этот хитрый сделать в методе Willrotate, заключается в том, что у нас не будет никакого способа узнать, что будет новая граница изменений, и не знает, какова наша текущая ориентация. (Если у вас нет устройства устройств, которые я не включен.) Все мы должны работать, - это то, что будет новая ориентация, и какова текущая ценность кадров нашей панели инструментов. Я мог бы сложный код и рассчитать настройки кадра старомодный способ, используя кусок царапин, но я действительно хочу сохранить функции размеров динамического просмотра, не делая никаких предположений о размерах экрана устройства.

Следовательно, используя следующий код, мне удалось исправить это, просто «ударил» панель инструментов на 12px относительно размера, который он только что стал. Чтобы предотвратить его из превышения, когда пользователь переворачивает устройство, я использую высоту кадра текущей панели инструментов для получения текущей ориентации. (Это означает, что я до сих пор делаю предположение относительно панели инструментов до и после размеров, но я чувствую себя лучше об этом, поскольку я могу повлиять на то, что в ассортимент, в отличие от того, чтобы пытаться программно изменить размер физического экрана устройства.)

@implementation UINavigationController (BLUINavigationControllerAutoRotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return TRUE;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    // Resize the navBar
    [[self navigationBar] performSelector:@selector(sizeToFit)
                               withObject:nil
                               afterDelay:(0.5f * duration)];

    // Read our current frame size
    CGRect toolbarFrame = self.toolbar.frame;

    // Prevent over adjusting when flipping the device
    if ((toolbarFrame.size.height < 38
         && (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft
             || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight))
        || (toolbarFrame.size.height > 38
            && (toInterfaceOrientation == UIInterfaceOrientationPortrait
                || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)))
    {
        // We are already resized and repositioned.
        return;
    }

    // Calculate and apply the toolbar offset
    const NSInteger delta = 12;     // the difference in size between 44 and 32 px.
    toolbarFrame.origin.y += ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
                              || (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)) ? (delta) : (-delta);
    self.toolbar.frame = toolbarFrame;

    // Resize the toolbar
    [[self toolbar] performSelector:@selector(sizeToFit)
                         withObject:nil
                         afterDelay:(0.5f * duration)];

}

@end

Итак, теперь я правильно вел навигационную панель и панель инструментов. Конечный пользователь никогда не узнает, что мне пришлось реализовать всю эту дополнительную работу, чтобы повторно включить то, что, похоже, должен быть стандартным поведением. Так что мой вопрос, почему я должен сделать все это? Есть ли лучший подход, о котором я должен знать, или что я просто не делаю в другом месте? (т.е. [навигационно -Поделитель SetautomateResizestoolbaronrotate: true]; или что-то в этом роде?) Как я уже сказал, это, похоже, это должно быть предварительно подключено, поэтому для меня придется финансировать с экспедированием сообщений, а принудительные триггеры чувствуют себя как переполненный взлом а не правильное решение.

Спасибо!

Это было полезно?

Решение

Вы проходите на сообщение WilrotateTetterfaceSorentationation на вкладку Controller View от контроллера Root View - почему бы не передавать все другие сообщения вращения и посмотреть, если это поможет? т.е.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [tabBarController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [tabBarController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation  {
    [super didRotateFromInterfaceOrientation:toInterfaceOrientation];
    [tabBarController didRotateFromInterfaceOrientation:toInterfaceOrientation];
}

- (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [tabBarController willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

- (void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    [super didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
    [tabBarController didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
}

- (void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateSecondHalfOfRotationFromInterfaceOrientation:toInterfaceOrientation duration:duration];
    [tabBarController willAnimateSecondHalfOfRotationFromInterfaceOrientation:toInterfaceOrientation duration:duration];
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top