shouldAutorotateToInterfaceOrientation: не удалось вызвать через некоторое время - PullRequest
0 голосов
/ 01 июня 2011

У меня есть проект, в котором события вращения перестают срабатывать после удаления / добавления большого количества view / viewControllers.Это работает некоторое время, а затем случайным образом новое представление, добавленное в окно, никогда не получает shouldAutorotateToInterfaceOrientation: call.

Строка состояния также не вращается, но контроллер вида / представления функционирует нормально (минус вращение).Также к окну одновременно добавляется только один view / viewController.Я предполагаю, что старый viewController зарегистрирован в качестве ключа, но все, что добавлено в окно, является подклассом контроллера представления, и ни один из подклассов не отображается в назначениях инструментов, кроме активного.

Есть ли способ наДелегат приложения или окно, чтобы найти, какой контроллер представления является ключевым?

Есть ли какая-либо другая причина, по которой shouldAutorotateToInterfaceOrientation: может не вызываться?

Каждый контроллер представления реализует:

- (BOOL)shouldAutorotateToInterfaceOrientation:

(UIInterfaceOrientation) interfaceOrientation {return YES;}

- (void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) 
                     interfaceOrientation duration: (NSTimeInterval) duration {
    //manual rotation code
}

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

[UIView transitionWithView:new.view 
                  duration:0.3
                   options:UIViewAnimationOptionCurveEaseOut
                animations:^{
                    //add new view
                    [self.window addSubview:new.view];

                    //play transition animation for old and new views
                    new.view.transform = CGAffineTransformConcat(new.view.transform, newEnd);
                    old.view.transform = CGAffineTransformConcat(old.view.transform, oldEnd);

                    //if old view is a "modal style" then keep it in front on new view
                    if([old conformsToProtocol:@protocol(PreloadableModalView)]) {
                        [self.window bringSubviewToFront:old.view];
                    }

                }
                completion:^(BOOL finished){
                    //remove old view
                    [old removeSubviews];
                    [old.view removeFromSuperview];
                }];

1 Ответ

0 голосов
/ 03 июня 2011

Похоже, корень проблемы заключался в том, что удаление viewController, когда окно отправляло событие поворота во время перехода, приводило к тому, что окно иногда не регистрировало новый viewcontroller в качестве нового корня.добавить один UIView (со своим собственным UIViewController) в окно.Во время анимации я удалял корневой контроллер вида и добавлял новый на экран.Исправлено было переключение контроллеров представления перед анимацией.

  1. Я создал скриншот текущего вида

  2. удалил старый контроллер вида

  3. setновый контроллер представления как rootviewcontroller и добавление представления в окно

  4. запустил анимацию перехода

  5. oncomplete я удаляю изображение

это основные части кода:

//create a image of old view and add to window
UIGraphicsBeginImageContext(old.view.bounds.size);
[[old.view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *screenshot = [[UIImageView alloc] initWithImage:snapshot];
[self.window addSubview:screenshot];
[screenshot release];

//remove view and viewcontroller
[old.view removeFromSuperview];

//set new viewcontroller as root
if(self.window.rootViewController)
    self.window.rootViewController = nil;
self.window.rootViewController = new;

//transition code goes here


//animate
[UIView transitionWithView:new.view 
                  duration:0.5
                   options:UIViewAnimationOptionCurveEaseOut
                animations:^{

                    //add new view
                    [self.window addSubview:new.view];

                    //play transition animation
                    if(isOldModalDisplay) {
                        screenshot.transform = CGAffineTransformConcat(new.view.transform, newEnd);
                        [self.window bringSubviewToFront:screenshot];
                    } else {
                        new.view.transform = CGAffineTransformConcat(new.view.transform, newEnd);
                    }
                }
                completion:^(BOOL finished){
                    //remove screenshot
                    [screenshot removeFromSuperview];
                }];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...