如何在 iOS 上旋转自定义启动画面?

Posted

技术标签:

【中文标题】如何在 iOS 上旋转自定义启动画面?【英文标题】:How do I rotate custom splash screen on iOS? 【发布时间】:2010-12-07 06:31:50 【问题描述】:

我的启动画面正在运行,但我的应用程序在横向模式下运行,并且启动画面以默认纵向模式显示。

如何启动应用,以便启动画面像我的应用一样在横向模式之间旋转?

我正在使用以下代码:

- (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];

但是我怎样才能把旋转放在显示屏里面呢?

【问题讨论】:

这篇文章与 Xcode 真正无关。所以,我已经从你的标题中删除了这个词。 添加了 iphone 和 ipad 标签,因为很多人都喜欢这些标签,您将获得更好的观看次数 【参考方案1】:

啊哈。如果您想显示自己的启动画面,您应该为此创建一个特殊的视图控制器,您已经这样做了。我认为您可以简化自动旋转查询代码:

- (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]);

有点乱,我自己对更简单的解决方案感兴趣。

【讨论】:

【参考方案2】:

@zoul - 到目前为止喜欢这个解决方案。但是,如果/当该视图有任何子视图时-它们不会出现。有什么想法吗?

更新:

通过向-startupImageWithOrientation:not self.view 中创建的 UIView 添加子视图来解决此问题。

- (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];

【讨论】:

【参考方案3】:

如果您已锁定方向,您的 defult.png 的分辨率会影响您的应用方向。

例如,如果使用 1024x768 的初始图像,并且初始视图不支持通过方向锁定进行纵向查看,这可能会导致可视 UI 对象出现在屏幕外(尤其是涉及动画时),因为视图将尝试呈现自己即使设备可能是横向的,也可以纵向配置。

通常,1024x768 图像表示纵向,而 768x1024 图像表示横向。

如果这还不够,或者您希望从初始默认图像无缝进入例如登录屏幕,那么您可以使用视图控制器来“继续”启动画面。

将所有普通 viewController 加载到窗口中,然后将您的“splash”视图控制器放入其中,然后在您的 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);

我使用的图像配置可能不适合您,因此可能需要进行一些实验。

【讨论】:

【参考方案4】:
- (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:

【讨论】:

以上是关于如何在 iOS 上旋转自定义启动画面?的主要内容,如果未能解决你的问题,请参考以下文章

可以在 android 和 ios 的颤振应用程序上删除启动画面

如何在 react-native 中禁用默认启动画面?

如何在 ionic 3 应用程序启动画面上设置自定义微调器

Movilizer - 启动画面 android

Worklight Cordova 应用程序启动画面在应用程序启动期间旋转

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面