标签: Launch Screen.storyboard

iOS解决Launch Screen.storyboard启动画面黑屏

查看启动屏图片的名字
启动图名字不要包含Launch这样的字眼。

启动图片工程中位置
将启动图放在工程的根目录下,不要放在Assets.xcassets中。

启动图的格式
建议使用png,尽量不要使用jpg

查看工程中是否仍在使用LaunchImage
将工程中与LaunchImage有关的全部删掉,包括Assets.xcassets中。*好在检查下plist文件和build Settings。

%title插图%num

%title插图%num

修改图片名字
有时候把启动图去掉,或者添加新的启动图,显示出来的还是之前的图片。这可能是缓存导致的,将启动图的名字改一下就会正常。

需要Clean重新编译
Clean后重新编译应用,或者直接清空DerivedData文件夹再重新编译。

删除应用重启手机
修改启动图后,*好卸载重装应用,有时可能还需要重启手机,否则可能会因为缓存还显示旧图片。

iOS开发时如何使用 Launch Screen Storyboard

静态启动图片

启动图片是iOS加载App的时候系统响应的直观呈现。近几年,随着屏幕尺寸的增多,制作相应的静态图片就变成一件十分让人头疼的事。在下面,我列举了一些 启动图片的尺寸(尺寸包括状态条区域)。为了简洁,我省略了横屏的版本:

  • iPad 2 and iPad mini (@1x): 768 x 1024
  • iPad and iPad mini (retina @2x): 1536 x 2048
  • iPhone 4s (retina @2x) 640 x 960
  • iPhone 5 (@2x): 640 x 1136
  • iPhone 6 (@2x): 750 x 1334
  • iPhone 6 Plus (@3x): 1242 x 2208

好消息是,在Xcode 6 and iOS 8允许使用NIB或storyboard launch screen 文件。利用auto layout 和size classes的优势,一个单独的NIB或storyboard文件在runtime时可以自动的去创建启动图片集。这就意味着,你想在全屏模式下支持iPhone 6 和 iPhone 6 Plus的话就无需提供匹配的的启动图集或者如上面列举出现来的不同尺寸的静态图片

( 26-Dec-2014 更新: 一定要搞清楚,支持iPhone 6 and iPhone 6 Plus ,要求你提供启动图片集合,可以是静态启动图集(static launch images),也可以是启动图布局文件( launch screen file)).

使用启动图片文件

Xcode6在创建新工程时默认添加了一个LaunchScreen.xib文件。对一个已经存在的工程可以用Launch Screen 模板创建一个新的文件。(译者注:在Xcode7里,默认添加的是LaunchScreen.storyboard文件,笔者因此遇到过一个大坑LaunchImage和LaunchScreen.xib混用出现的坑)

%title插图%num

这一步将会在工程中添加一个NIB文件,你可以在初始化的启动屏上添加单个视图或者视图控制器。如果你有多个视图,那么你则需要放弃Launch Screen模板,应该添加一个storyboard。然后在target的工程设置里面指定启动图来源:

%title插图%num

2014-12-24-005.png

这一步将会把 键 Launch screen interface file base name
(UILaunchStoryboardName)加到应用的plist 文件中

%title插图%num

2014-12-24-003.png

接下来,你可以在Interface Builder对启动视图进行布局,使autolayout和size classes作为必选项,为不同的屏幕创建匹配的图片。Xcode模板提供的风格,只是对app的名称和所有权进行了布局,这并不是一个*理想的范例。在你添加自己的视图之前,或许你想删掉它们:

%title插图%num

2014-12-24-004.png

你可以在Xcode中预览storyboard,或者在模拟器和真机上进行测试。尽管启动屏的展示的时间很短,但是你会发现,如果在App delegate的application:didFinishLaunchingWithOptions:方法中添加断点是有用的

Launch Screen 的局限性

系统在启动app之前装载启动文件,在这个过程中可能对app包含的一些文件产生限制(一些限制可能迫使你回退到 使用静态图片集):

  • app还没装载完毕,一些视图的层级结构还不存在,系统不能调用app中任何自定义的视图控制器去启动代码。
  • 你仅仅能使用标准的UIKit类,所以你可以用UIView或者UIViewController,自定义的子类则不可以。如果你尝试着去设置子类,将会得到一个“配置无效”的错误。
  • 启动文件仅仅能够用基础的UIKit视图,像UIImageView 和UILabel,不能使用 UIWebView。
  • 如果你用了storyboard,你可以指定多个视图控制器,但是仍旧有一些限制。例如,你可以在navagation或者tab bar controller嵌入几个视图控制器,但是一些更复杂的类,像UISplitViewController 并不起作用 (至少现在如此).
  • 本地化(译者注:我理解的是自己创建的,而非采用模板)启动图布局文件目前看起来并没有什么不好的影响。也许,你采用的*基本的本地化启动图布局文件可能是不在启动图上显示文字。
  • 你不能为iPhone和iPad指定不同的启动文件。因为auto layout 和size classes的局限性,如果这些设备有着显著不同的界面,就会出现问题。

如果你正在ios7系统上进行开发,那么你仍旧需要包含 静态启动图集。你可以包含启动图布局文件静态启动图集。那么,运行ios8系统的iPhone6将会使用启动图布局文件,而运行ios7系统的设备则回退使用 静态启动图集

Split View Controllers

如果你的根视图控制器是SplitViewControllers,至少在iOS8.1系统,你并没有太多的选择。如果你将SplitViewControllers添加到launch screen storyboard,它不会被装载。由于在iOS8.1中SplitViewControllers复杂度的增加,我怀疑在后续版本中也不会被支持。

除了回退去使用 静态启动图集,唯一能够选择的方式看起来只有放弃 分屏使用。例如,考虑一下接下来使用SplitViewController的iPhone和ipad的启动屏。在iphone(宽度较窄)设备上,初始化的屏幕仅展示主视图控制器(一个嵌入在Navigation Controller里的tableview controller)

%title插图%num

2014-12-24-iphone.png

在ipad(常规宽度)设备上,初始化后的启动屏在分屏控制器里展示的master and detail view controllers

%title插图%num

2014-12-24-ipad.png

这是一种常见的启动方式,但是在这种情况下,没有好的方法使用启动图布局文件.我的建议,即我能得到的*接近的方式是忽略启动屏,用一个嵌套在navigation controller的view controller 作为启动屏

%title插图%num

2014-12-24-006.png

尽管这种方式远远没有达到完美的地步,但是在适配(除了ipad分屏)所有设备用户初始化界面 方面多多少少做了贡献。呈现给用户的静态启动图集虽然效果足够好,但是自己不得不做出判断。

Runtime Generation (added 28-Dec-2014)

尽管苹果文档中并没有清楚地说明,但需要的启动图片在runtime时被生成了。在WWDC 2014
Platform State of the Union上被简短的提到过。你可以通过App在真机或者模拟器上生成的文件夹证实。被特定设备需要的启动图被缓存在Library/Caches/LaunchImages。下面的截屏显示了iPad Air 2生成的启动图片

%title插图%num

 

IOS使用Launch Screen.storyboard制作广告启动界面

*近项目在做的广告sdk,刚好自己需要去了解这个实现启动图加载广告这个功能,大家应该都了解,之前Xcode 6是LaunchScreen.xib来当作启动视图,不过到了Xcode 7就变成了Launch Screen.storyboard,其实这两个没有多大的区别,以下我就采用Xcode 7提供的LaunchScreen.storyboard 来实现这个功能,现在把自己经验和代码分享出来。

主要思路

获取Launch Screen.storyboard

通过使用storyborardID去获取启动视图viewcontroller

获取启动viewController的视图view

之后把视图view添加到window中

*后就是新建一个图片贴在视图view中

做个定时触发处理

废话不多说啦,直接贴代码出来:

AppDelegate.m中的代码

//获取LaunchScreen.storyborad

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@”Launch Screen” bundle:nil];

//通过使用storyborardID去获取启动页viewcontroller

UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@”LaunchScreen”];

//获取viewController的视图

self.view = viewController.view;

//把视图添加到window

[self.window addSubview:self.view];

self.launchView = [[UIImageView alloc] initWithFrame:self.window.frame];

[self.launchView setImage:[UIImage imageNamed:@”launch.jpg”]];//这边图片可以做网络请求加载图片、视频动画或者其他自定义的引导页

[self.view addSubview:self.launchView];

//将图片视图推送到前面

[self.window bringSubviewToFront:self.launchView];

//设置3秒定时触发

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(colseLaunchScreen) userInfo:nil repeats:NO];

– (void)colseLaunchScreen {

if (self.launchView) {

[self.launchView removeFromSuperview];

self.launchView = nil;

}

if (self.view) {

[self.view removeFromSuperview];

self.view = nil;

}

}

这边也可以结合LaunchImage使用,方式也是差不多,这边就不多讲了

注意有个坑已填平了:之前我用的xcode项目中General中Main Interface 启动项目初始化的主界面storyboard,用以上方法一直看不到加载的广告,后面使用在AppDelegate代码方式去加载storyboard,就可以加载出来了,目前不清楚这个是什么问题,待研究发现,如有发现朋友,方便留言告知下,谢啦(后面经过友友们的指出,发现如果不是用代码加载storyboard,那General->Main Interface->的main.storyboard加载会新建window,跟你之前传入的window不是同一个,这个之前的就被覆盖了,导致看不到广告效果,之后我修改了方案,把window改成用window中viewController中view这要就避免代码加载stroyboard了)

这里注意一下,上面这个使用storyboard启动适用ios8.0以上,但现在应用差不多都是ios7.0起,开发者为了方便适配,大多都采用launchImage启动,这种也可以使用storyboard去获取广告,完全没有问题,但在加载初始化广告肯定会消耗一点点时间这要就会出现短暂storyboard的默认页面,这个可以通过把获取rootview先隐藏,等加载完毕广告再显示出来!这要问题解决了!

如果先获取launchImage的图片可以采用Cherpak Evgeny 分享在stackflow上的一个直接读取NSBundle中的设置 即可获取当前适用的LaunchImage的办法,代码我也贴出来:

CGSize viewSize =self.window.bounds.size;

NSString *viewOrientation =@”Portrait”;//横屏请设置成 @”Landscape”

NSString *launchImage =nil;

NSArray *imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@”UILaunchImages”];

for(NSDictionary* dict in imagesDict) {

CGSize imageSize =CGSizeFromString(dict[@”UILaunchImageSize”]);

if(CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@”UILaunchImageOrientation”]]) {

launchImage = dict[@”UILaunchImageName”];

}

}

UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImageimageNamed:launchImage]];

launchView.frame=self.window.bounds;

launchView.contentMode=UIViewContentModeScaleAspectFill;

[self.window addSubview:launchView];

[UIView animateWithDuration:2.0f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState

animations:^{

launchView.alpha=0.0f;

launchView.layer.transform=CATransform3DScale(CATransform3DIdentity,1.2,1.2,1);

}

completion:^(BOOL finished) {

[launchView removeFromSuperview];

}];

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速