Правильное использование iOS willRotateToInterfaceOrientation

У меня очень простой UIViewController, и я пытаюсь выяснить, как использовать willRotateToInterfaceOrientation. мой UIViewController имеет очень простой метод viewDidLoad:

-(void)viewDidLoad {
    [super viewDidLoad];

    theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)];
    theBar.tintColor = [UIColor orangeColor];

    UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"The Title"];
    item.hidesBackButton = YES;
    [theBar pushNavigationItem:item animated:YES];
    [item release];

    [self.view addSubview:theBar];
}

В общем, у меня просто UINavigationBar наверху моего контроллера. Вот и все. Я реализовал несколько методов ротации, основанных на том, что я нашел в Интернете:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {

    if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) {
        theBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 640, 48)];
    }
}

Итак, я запускаю приложение в портретном режиме, а затем поворачиваю в ландшафтном режиме. И в основном theBar все еще остается нормального размера и не изменяется. Я уверен, что это глупый вопрос, но как правильно использовать возможность вращения? Я хочу сделать так, чтобы он также работал, если приложение запускается в ландшафтном режиме. Как лучше всего инициализировать мои компоненты при первом запуске UIViewController, помня о том, что мне нужна поддержка обеих ориентаций, а также помня о том, что я хочу иметь возможность изменять размер всего, основываясь на изменениях ориентации на протяжении всего периода? из жизни UIViewController? Спасибо!

1 ответ

Решение

То, что вы хотите сделать, это изменить фрейм вашего существующего объекта theBar, а не создавать новый. Вы можете сделать это примерно так:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation 
                                         duration:(NSTimeInterval)duration {
    CGRect f = CGRectMake(0, 
                          0, 
                          CGRectGetWidth(self.view.frame), 
                          CGRectGetHeight(theBar.frame);    
    theBar.frame = f;
}

Обратите внимание, что значение self.view.frame используется, который содержит значения после поворота. Также обратите внимание, что функция, которую я здесь использую, отличается от вашей. Я не проверял это с функцией, которую вы используете, поэтому я не могу сказать, сработает ли это или нет. Наконец, вы можете избежать всего этого, просто установив маску autoresizing на theBar в viewDidLoad вместо:

[theBar setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
Другие вопросы по тегам