如何在 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 的颤振应用程序上删除启动画面