Завъртането на устройства с iOS6 ще бъде ограничено

За моето приложение искам да оставя устройството да се върти така или иначе, но с главата надолу. Това работи добре. Искам обаче да спра приложението да се върти конкретно от

пейзаж вляво -> пейзаж вдясно - и обратно

Ако някой е любопитен, това е така, защото това завъртане обърква моите оформления, тъй като всяко от тях се върти от обща точка

Моят код за iOS 5, който мисля, че ще работи, е така:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {

    NSLog(@"Rotating");
    if((lastOrient == 3 && toInterfaceOrientation == 4) || (lastOrient == 4 && toInterfaceOrientation == 3)){
       lastOrient = toInterfaceOrientation;
       return NO;
    }

   lastOrient = toInterfaceOrientation;
   return YES;

}

Където 3= пейзаж вляво и 4= пейзаж вдясно

Някакви предложения как да направите това с iOS6? Или съвсем различно решение?


person Jameo    schedule 27.11.2012    source източник


Отговори (2)


shouldAutorotateToInterfaceOrientation е отхвърлен в ios6. Използвай това:

- (BOOL)shouldAutorotate {

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

if (lastOrientation==UIInterfaceOrientationPortrait && orientation == UIInterfaceOrientationPortrait) {
 return NO;

}

return YES;
}

Не съм тествал този код. Можете да получите повече информация в тези публикации: shouldAutorotateToInterfaceOrientation не работи в iOS 6 shouldAutorotateToInterfaceOrientation не се извиква в iOS 6

person dmoss18    schedule 27.11.2012
comment
очевидно можете да включите и двете реализации (shouldAutorotateToOrientation и shouldAutorotate) и трябва да се спусне каскадно от ios6 - person dmoss18; 28.11.2012

Добре, отговорих на собствения си въпрос тук:

Добрата новина е, че определено има начин да направите това! И така, ето основите:

В iOS6 от appDelegate зависи дали приложението може да се върти като цяло. След това, когато устройството получи сигнал за въртене, то ще поиска вашия изглед за поддържаните ориентации. Това е мястото, където внедрих моя код. Всъщност shouldAutorotate() не играе никаква роля в решението.

Затова създавам променлива, за да следя последната ориентация, и я променям

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

По този начин мога да сравня ориентациите

-(NSUInteger)supportedInterfaceOrientations
{
    NSLog(@"Last Orient = %d", lastOrient);
    NSUInteger orientations = UIInterfaceOrientationMaskPortrait;

    if (lastOrient != 3 && lastOrient != 4) {
        NSLog(@"All good, rotate anywhere");
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else if(lastOrient == 3){
        orientations |= UIInterfaceOrientationMaskLandscapeRight;
        NSLog(@"Can only rotate right");
    }
    else if(lastOrient == 4){
        orientations |= UIInterfaceOrientationMaskLandscapeLeft;
        NSLog(@"Can only rotate left");
    }

    return orientations;
}

Изглежда, че работи за мен. Малко хак, но прави това, което трябва

person Jameo    schedule 27.11.2012