我可以为图像设置动画吗 iOS8 LaunchScreen.xib
Can I Animate an image iOS8 LaunchScreen.xib
问题:
有没有办法在 LaunchScreen.xib 文件的 Xcode 6 项目中为 iOS 8.1+ 部署的任何内容设置动画?
上下文:
我希望制作简单的动画来传达 activity 或在用户等待时分散他们的注意力...
示例:
- 一个加载栏
- Activity 指标
- GIF 动画
- 在屏幕上移动 UIImage
- 旋转图像
我不经常使用启动画面,但当我使用时,我希望它们像书本一样打开。
说实话,我不太喜欢启动画面,甚至 Apple 也建议使用 default.png 来显示应用程序的控件(无文本):
显示与应用程序的第一个屏幕非常相似的启动图像。这种做法减少了您的应用程序的感知启动时间。
避免显示关于 window 或初始屏幕。一般来说,尽量避免提供任何类型的启动体验,以免人们立即使用您的应用程序。
来自 HIG 指南
但是,有些人喜欢它们,特别是一个应用程序有一个很好的实现启动画面 — Path 2.0。当你打开 Path 时,你会看到他们的标志出现在红色版本的 Apple 亚麻纹理上,它像一本书一样打开(或日记,因为 Path 认为自己是这样)。
您可以在此处获取此项目的源代码:https://github.com/jaysonlane/OpenBook
在我们开始之前,让我先声明一下:我对 Cocoa 中的动画还很陌生,所以请多多包涵。如果您发现不必要或低效的代码,请发表评论,我会整理。
如果您还没有看过动画,请跳转到应用商店并获取一份副本,看看我们正在努力完成什么。我创建了一个默认的 png,我们可以使用它巧妙地命名为 Math(就像打开的数学书一样,对吧?)您可以在此处 (retina) 和此处下载。
首先,让我解释一下我们将要做的事情背后的“诡计”:我们将使用正常的默认启动系统来显示我们的 default.png。在 App Delegate 中,应用程序完成启动后,我们将在相同 default.png 的视图之上创建一个 UIImageView。然后我们将为 UIImageView 设置动画,旋转打开以显示我们的视图。
那我们走吧:
创建一个新项目,我使用单一视图模板创建了一个项目,但这适用于任何项目。继续将 default.png 和 default@2x.png 设置为提供的图像。您可以通过单击左侧导航窗格中的项目来执行此操作,单击目标并向下滚动以启动图像:
打开您的 AppDelegate.m 并将以下代码添加到您的应用程序 didFinishLaunching 或应用程序 didFinishLaunchingWithOptions 函数中:
//1. add the image to the front of the view...
UIImageView *splashImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[splashImage setImage: [UIImage imageNamed:@"Default"]];
[self.window addSubview:splashImage];
[self.window bringSubviewToFront:splashImage];
//2. set an anchor point on the image view so it opens from the left
splashImage.layer.anchorPoint = CGPointMake(0, 0.5);
//reset the image view frame
splashImage.frame = CGRectMake(0, 0, 320, 480);
//3. animate the open
[UIView animateWithDuration:1.0
delay:0.6
options:(UIViewAnimationCurveEaseOut)
animations:^{
splashImage.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI_2, 0, 1, 0);
} completion:^(BOOL finished){
//remove that imageview from the view
[splashImage removeFromSuperview];
}];
这里发生了三件事……
1)我们新建一个UIImageView,并把它添加到视图的顶部
2)我们在图像的左侧设置一个锚点,使其从左侧打开,然后将框架重置为视图的全尺寸
3) 我们为 UIImageView 设置动画并在完成时将其从视图中移除
就是这样,就这么简单
来源:http://jaysonlane.net/tech-blog/2012/03/path-2-0-style-animated-splash-screen-default-png/
没有。
启动图像仅在用户选择启动您的应用和您的应用实际启动之间的时间段内显示 运行。在此期间,您的应用不能执行任何操作,例如执行动画 — 还不是 运行。启动图像只是一个静态图像,如果设计得当,它有助于给用户留下您的应用程序已快速准备就绪的印象。
(一些开发者忽略 the HIG 并使用启动图像提供启动画面,有时还带有动画演示。但在那些情况下,启动画面仍然是静态图像,动画只出现一次应用程序开始 运行 — 只是 运行 应用程序绘制的第一帧动画与静态启动图像的外观相匹配。)
这种行为并没有随着 iOS 8 中的 LaunchScreen.xib 功能而改变——它仍然 仅在您的应用实际 运行,所以它仍然是静态图像。 LaunchScreen.xib 功能让您能够自适应地为许多不同的设备尺寸和样式生成启动图像,而无需为每个 size/orientation/etc 单独设计、渲染和在您的应用程序中捆绑不同的图像。
如果您的应用在获得控制权时实际上还没有准备好使用,请考虑您当时正在执行的 "loading" 任务是否真的需要立即完成,或者您是否可以让用户立即开始做一些事情,并在后台线程上做更多的设置工作,或者推迟到实际需要时再做。
您可以创建 LaunchScreen.xib,然后创建一个完美的副本,您可以在上面放置代码,并拥有一个 class 之类的 LaunchScreenAnimator,您可以从您的委托中调用它,并且有一个委托可以告诉动画结束时的你
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
LaunchScreenAnimator *la=[LaunchScreenAnimator createWithDelegate:self];
self.window.rootViewController=la;
[self.window makeKeyAndVisible];
[la startAnimation];
return YES;
}
-(void) splashAnimationFinished:(LaunchScreenAnimator*)view
{
[self startWithDashboardWindow]; // replace the current rootViewController with whatever you want
}
问题:
有没有办法在 LaunchScreen.xib 文件的 Xcode 6 项目中为 iOS 8.1+ 部署的任何内容设置动画?
上下文:
我希望制作简单的动画来传达 activity 或在用户等待时分散他们的注意力...
示例:
- 一个加载栏
- Activity 指标
- GIF 动画
- 在屏幕上移动 UIImage
- 旋转图像
我不经常使用启动画面,但当我使用时,我希望它们像书本一样打开。
说实话,我不太喜欢启动画面,甚至 Apple 也建议使用 default.png 来显示应用程序的控件(无文本):
显示与应用程序的第一个屏幕非常相似的启动图像。这种做法减少了您的应用程序的感知启动时间。
避免显示关于 window 或初始屏幕。一般来说,尽量避免提供任何类型的启动体验,以免人们立即使用您的应用程序。
来自 HIG 指南
但是,有些人喜欢它们,特别是一个应用程序有一个很好的实现启动画面 — Path 2.0。当你打开 Path 时,你会看到他们的标志出现在红色版本的 Apple 亚麻纹理上,它像一本书一样打开(或日记,因为 Path 认为自己是这样)。
您可以在此处获取此项目的源代码:https://github.com/jaysonlane/OpenBook
在我们开始之前,让我先声明一下:我对 Cocoa 中的动画还很陌生,所以请多多包涵。如果您发现不必要或低效的代码,请发表评论,我会整理。
如果您还没有看过动画,请跳转到应用商店并获取一份副本,看看我们正在努力完成什么。我创建了一个默认的 png,我们可以使用它巧妙地命名为 Math(就像打开的数学书一样,对吧?)您可以在此处 (retina) 和此处下载。
首先,让我解释一下我们将要做的事情背后的“诡计”:我们将使用正常的默认启动系统来显示我们的 default.png。在 App Delegate 中,应用程序完成启动后,我们将在相同 default.png 的视图之上创建一个 UIImageView。然后我们将为 UIImageView 设置动画,旋转打开以显示我们的视图。
那我们走吧:
创建一个新项目,我使用单一视图模板创建了一个项目,但这适用于任何项目。继续将 default.png 和 default@2x.png 设置为提供的图像。您可以通过单击左侧导航窗格中的项目来执行此操作,单击目标并向下滚动以启动图像:
打开您的 AppDelegate.m 并将以下代码添加到您的应用程序 didFinishLaunching 或应用程序 didFinishLaunchingWithOptions 函数中:
//1. add the image to the front of the view...
UIImageView *splashImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[splashImage setImage: [UIImage imageNamed:@"Default"]];
[self.window addSubview:splashImage];
[self.window bringSubviewToFront:splashImage];
//2. set an anchor point on the image view so it opens from the left
splashImage.layer.anchorPoint = CGPointMake(0, 0.5);
//reset the image view frame
splashImage.frame = CGRectMake(0, 0, 320, 480);
//3. animate the open
[UIView animateWithDuration:1.0
delay:0.6
options:(UIViewAnimationCurveEaseOut)
animations:^{
splashImage.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI_2, 0, 1, 0);
} completion:^(BOOL finished){
//remove that imageview from the view
[splashImage removeFromSuperview];
}];
这里发生了三件事……
1)我们新建一个UIImageView,并把它添加到视图的顶部 2)我们在图像的左侧设置一个锚点,使其从左侧打开,然后将框架重置为视图的全尺寸 3) 我们为 UIImageView 设置动画并在完成时将其从视图中移除
就是这样,就这么简单
来源:http://jaysonlane.net/tech-blog/2012/03/path-2-0-style-animated-splash-screen-default-png/
没有。
启动图像仅在用户选择启动您的应用和您的应用实际启动之间的时间段内显示 运行。在此期间,您的应用不能执行任何操作,例如执行动画 — 还不是 运行。启动图像只是一个静态图像,如果设计得当,它有助于给用户留下您的应用程序已快速准备就绪的印象。
(一些开发者忽略 the HIG 并使用启动图像提供启动画面,有时还带有动画演示。但在那些情况下,启动画面仍然是静态图像,动画只出现一次应用程序开始 运行 — 只是 运行 应用程序绘制的第一帧动画与静态启动图像的外观相匹配。)
这种行为并没有随着 iOS 8 中的 LaunchScreen.xib 功能而改变——它仍然 仅在您的应用实际 运行,所以它仍然是静态图像。 LaunchScreen.xib 功能让您能够自适应地为许多不同的设备尺寸和样式生成启动图像,而无需为每个 size/orientation/etc 单独设计、渲染和在您的应用程序中捆绑不同的图像。
如果您的应用在获得控制权时实际上还没有准备好使用,请考虑您当时正在执行的 "loading" 任务是否真的需要立即完成,或者您是否可以让用户立即开始做一些事情,并在后台线程上做更多的设置工作,或者推迟到实际需要时再做。
您可以创建 LaunchScreen.xib,然后创建一个完美的副本,您可以在上面放置代码,并拥有一个 class 之类的 LaunchScreenAnimator,您可以从您的委托中调用它,并且有一个委托可以告诉动画结束时的你
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
LaunchScreenAnimator *la=[LaunchScreenAnimator createWithDelegate:self];
self.window.rootViewController=la;
[self.window makeKeyAndVisible];
[la startAnimation];
return YES;
}
-(void) splashAnimationFinished:(LaunchScreenAnimator*)view
{
[self startWithDashboardWindow]; // replace the current rootViewController with whatever you want
}