Контроллер представления не получает -shouldAutorotateToInterfaceOrientation: сообщения при второй загрузке? - PullRequest
3 голосов
/ 30 сентября 2009

У меня есть UIViewController, который я использую для управления «всплывающим» видом для просмотра изображений во всем приложении. Он поддерживает автоповорот, так как автоматически подгоняет размер изображения под размер независимо от ориентации. Это работает отлично, но только в первый раз я инициализирую и отображаю контроллер вида. Когда он закрывается, я удаляю UIView из моей иерархии представления и освобождаю контроллер представления - но в следующий раз, когда я создаю его экземпляр и добавляю его в мою иерархию представления, он прекращает получать сообщения -shouldAutorotateToInterfaceOrientation, когда телефон поворачивается.

Вот как я его создаю и отображаю:

popupVC = [[PopupVC alloc] init];
[popupVC viewWillAppear:NO];
[[[UIApplication sharedApplication] keyWindow] addSubview:popupVC.view];
[popupVC viewDidAppear:NO];

вот как я удаляю / отпускаю его по окончании:

[popupVC viewWillDisappear:NO];
[popupVC.view removeFromSuperview];
[popupVC viewDidDisappear:NO];
[popupVC release];
popupVC = nil;

Я попытался перебрать [[UIApplication sharedApplication] keyWindow] подпредставления, чтобы увидеть, не является ли мое всплывающее окно каким-то образом сверху, но так оно и есть. И у него каждый раз свой адрес, поэтому я знаю, что это другой экземпляр класса контроллера представления.

По запросу, вот полный метод loadView из PopupVC:

- (void)loadView {

    UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    myView.backgroundColor = self.overlayColor;
    myView.autoresizesSubviews = NO;
    myView.hidden = YES;
    myView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.view = myView;
    [myView release];

    _isVisible = NO;

    UIView *myMaskView = [[UIView alloc] initWithFrame:self.view.bounds];
    myMaskView.backgroundColor = [UIColor clearColor];
    myMaskView.clipsToBounds = YES;
    myMaskView.hidden = YES;
    myMaskView.autoresizesSubviews = NO;
    myMaskView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:myMaskView];
    self.imageMaskView = myMaskView;
    [myMaskView release];

    UIImageView *myImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    myImageView.center = self.view.center;
    myImageView.hidden = NO;
    myImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
    [self.imageMaskView addSubview:myImageView];
    self.imageView = myImageView;
    [myImageView release];

    UIButton *myImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
    myImageButton.frame = self.view.frame;
    myImageButton.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
    [myImageButton addTarget:self action:@selector(clickImage:) forControlEvents:UIControlEventTouchUpInside];
    [self.imageMaskView addSubview:myImageButton];
    self.imageButton = myImageButton;

    UIActivityIndicatorView *myActivityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    myActivityView.hidden = YES;
    [self.view addSubview:myActivityView];
    myActivityView.center = self.view.center;
    self.activityView = myActivityView;
    [myActivityView release];
}

Ответы [ 3 ]

6 голосов
/ 15 октября 2009

Я думаю, что это может быть ошибкой в ​​новой ОС 3.0. Обойти эту проблему можно было бы с помощью NSNotificationCenter после включения beginGeneratingDeviceOrientationNotifications.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedRotate:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
}

-(void) receivedRotate: (NSNotification *) notification {
    DebugLog(@"ORIENTATION CHANGE");

    UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];

        if(interfaceOrientation == UIDeviceOrientationPortrait) {
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
            self.view.bounds = CGRectMake(0, 0, 320, 480);
        }
        else if(interfaceOrientation == UIDeviceOrientationLandscapeLeft) {
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
            self.view.bounds = CGRectMake(0, 0, 480, 320);
        }
        else if(interfaceOrientation == UIDeviceOrientationLandscapeRight) {
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
            self.view.bounds = CGRectMake(0, 0, 480, 320);
        }
}
6 голосов
/ 01 октября 2009

Обработчик shouldAutorotateToInterfaceOrientation не место для пользовательского кода, чтобы реагировать на события вращения. Его цель - просто сообщить ОС, что ваш контроллер представления может вращаться. Если вы хотите иметь собственный код для обработки событий ротации, вам следует переопределить - didRotateFromInterfaceOrientation или другой аналогичный метод обратного вызова в зависимости от ваших потребностей:

  • willRotateToInterfaceOrientation:duration:
  • willAnimateRotationToInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • didAnimateFirstHalfOfRotationToInterfaceOrientation:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:

См. Autorotating Views в документации разработчика.

0 голосов
/ 26 октября 2009

Моя проблема в том, что я получаю событие поворота для моего rootViewController, но как только я запускаю свой второй viewController, он не получает никаких сигналов, кроме движения (встряхивания) и касания. Это та же проблема, что и в оригинальном посте - это, конечно, похоже ??

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...