Как повернуть собственный экран заставки на iOS? - PullRequest
5 голосов
/ 07 декабря 2010

Мой заставка работает, но мое приложение работает в ландшафтном режиме, а заставка отображается в портретном режиме по умолчанию.

Как я могу запустить приложение, чтобы заставка вращалась между альбомными режимами, как мое приложение?

Я использую следующий код:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
    interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    return YES;
else {
    return NO;  }
}

и для заставки

-(void)displayScreen { 
UIViewController *displayViewController=[[UIViewController alloc] init];
displayViewController.view = displaySplashScreen;
[self presentModalViewController:displayViewController animated:NO];
[self performSelector:@selector(removeScreen) withObject:nil afterDelay:3.0];
} 
 -(void)removeScreen
{   [[self modalViewController] dismissModalViewControllerAnimated:YES];
}

Но как я могу поставить вращение внутри экрана дисплея?

Ответы [ 4 ]

4 голосов
/ 07 декабря 2010

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

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) foo
{
    return YES; // all interface orientations supported
}

Теперь вам нужно подумать о заставках для разных ориентаций. У вас есть отдельная заставка для пейзажа и портрета? Если да, вы можете сделать что-то вроде этого:

- (UIView*) startupImageWithOrientation: (UIInterfaceOrientation) io
{
    UIImage *img = [UIImage imageNamed:[NSString
        stringWithFormat:@"Default-%@.png", UIInterfaceOrientationName(io)]];
    UIView *view = [[UIImageView alloc] initWithImage:img];
    [view setFrame:[[UIScreen mainScreen] applicationFrame]];
    return [view autorelease];
}

- (void) loadView
{
    self.view = [self startupImageWithOrientation:self.interfaceOrientation];
}

- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) io
    duration: (NSTimeInterval) duration
{
    self.view = [self startupImageWithOrientation:io];
    self.view.transform = CGAffineTransformFromUIOrientation(io);
}

Вызваны две служебные функции, вы можете поместить их в отдельный файл:

NSString *UIInterfaceOrientationName(UIInterfaceOrientation io)
{
    return UIInterfaceOrientationIsPortrait(io) ? @"Portrait" : @"Landscape";
}

CGAffineTransform CGAffineTransformFromUIOrientation(UIInterfaceOrientation io)
{
    assert(io <= 4);
    // unknown, portrait, portrait u/d, landscape L, landscape R
    static float angles[] = {0, 0, M_PI, M_PI/2, -M_PI/2};
    return CGAffineTransformMakeRotation(angles[io]);
}

Это немного грязно, мне самому было бы интересно более простое решение.

3 голосов
/ 22 декабря 2010

@ zoul - люблю это решение до сих пор. однако, если / когда у этого представления есть какие-либо подпредставления - они не отображаются. есть идеи?

Обновление:

исправил эту проблему, добавив подпредставление в UIView, созданное в -startupImageWithOrientation: , а не self.view.

- (UIView *)startupImageWithOrientation:(UIInterfaceOrientation)io{
    UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"Default-%@.png", UIInterfaceOrientationName(io)]];
    UIView *aView = [[UIImageView alloc] initWithImage:img];
    [aView setFrame:[[UIScreen mainScreen] applicationFrame]];

    // define the version number label
    self.versionNumberLabel_iPadSplashScreen.text = [NSString stringWithFormat:@"Version %@", 
                                                                           [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]; 

    [aView addSubview:self.versionNumberLabel_iPadSplashScreen];

    return [aView autorelease];
}
1 голос
/ 07 декабря 2010

Разрешение вашего defult.png может влиять на ориентацию ваших приложений, если вы заблокировали ориентации.

Например, если используется изображение-всплеск 1024x768, и начальный вид не поддерживает портретный просмотр через ориентационные блокировки, этоможет привести к тому, что объекты визуального пользовательского интерфейса будут отображаться за пределами экрана (особенно когда задействована анимация), поскольку представление будет пытаться представить себя в портретной конфигурации, даже если устройство может быть в альбомной ориентации.

Как правило, изображения 1024x768 подразумевают портретную, аИзображения 768x1024 подразумевают альбомную ориентацию.

Если этого недостаточно, или вы хотите плавно перейти от исходного изображения по умолчанию, например, к экрану входа в систему, то вы можете использовать контроллер представления для «продолжения» всплеска.

Загрузите все обычные viewController в окно, затем вставьте свой всплеск viewController, затем в свой splashController используйте метод shouldAutorotateToInterfaceOrientation для установки правильного изображения (на ImageViewController):

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.

 switch ([[UIDevice currentDevice] orientation])
 {
  case UIInterfaceOrientationLandscapeRight:
   splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default"] ofType:@"png"]];
   break;
  case UIInterfaceOrientationPortrait:
   splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default"] ofType:@"png"]];
   break;
  default:
   splashImage.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Default2"] ofType:@"png"]];
   break;
 } 

   return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

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

0 голосов
/ 13 декабря 2010
- (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
    {
        // take action here , when phone is "Portrait" 

    }
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
    {
        action 4 LandscapeLeft

    }
    else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        //PortraitUpsideDown

    }
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        //LandscapeRight

    }

обратите внимание, что вы должны вернуть YES метод shouldAutorotateToInterfaceOrientation:

...