Ориентация без анимации дает странный результат при наличии UIAlertView

Я столкнулся с какой-то странной проблемой.

По какой-то причине я отключу анимацию во время изменения ориентации в контроллере просмотра с помощью [UIView setAnimationsEnabled:NO];
Но когда присутствует предупреждение, и если я изменяю ориентацию, это дает странный результат.

Приложенный снимок экрана - это когда я изменяю ориентацию на пейзаж.

landscape mode

Обратите внимание: Я использую стандартный UIAlertView, и это оверлей по умолчанию, который отображается, когда присутствует вид предупреждения, и здесь нет настройки.

В соответствии с documentation

If you disable animations, code inside subsequent animation blocks is still executed but no animations actually occur. Thus, any changes you make inside an animation block are reflected immediately instead of being animated.

Поэтому он не должен влиять на изменение размера оверлея по умолчанию. Is it a restriction in disabling animation !??

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

Ответ 1

Кажется, это ошибка в iOS6 и ниже и исправлена ​​в iOS7.

iOS alert view without animation

Ответ 2

Когда вы устанавливаете [UIView setAnimationsEnabled:NO];, UIAlertView не меняет размер на Overlay View (я думаю, что это ошибка).

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

Создайте переменную BOOL в файле .h.

BOOL shouldRotate;

инициализируйте его YES в viewDidload.

И всякий раз, когда вы показываете оповещение в это время, сделайте shouldRotate = NO;

И реализуем делегат UIAlertView следующим образом:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    shouldRotate = YES;
}

Надеюсь, вам помогут.

Изменить:. Как вы хотите и анимацию и вращение с представлением предупреждения

На самом деле это взлом, но работает,

alert - объект UIAlertView, объявленный в файле .h.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    if (UIInterfaceOrientationPortrait == UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
        UIImageView *imgView = (UIImageView *)[alert.superview.subviews objectAtIndex:0];
        imgView.frame = CGRectMake(0.0, 0.0, 480.0, 320.0);
    }
    else{
        UIImageView *imgView = (UIImageView *)[alert.superview.subviews objectAtIndex:0];
        imgView.frame = CGRectMake(0.0, 0.0, 320.0, 480.0);
    }
}

Ответ 3

Еще одна возможность справиться с этой ошибкой - это отбросить программный вид предупреждения до поворота и отобразить новый после завершения вращения.

Это будет автоматически работать для любого устройства iOS независимо от размера экрана.