在 SWIFT 中启动图像启动画面动画
Launch Image Splash Screen Animation in SWIFT
我想为我在 swift 中的 ios 应用程序创建类似 Twitter 的启动图像。
我明白动画启动图像的一般问题,我基本上知道创建这样一个动画的步骤:
- 应用启动后立即添加新视图,内容与启动图像完全相同
- 为该视图设置动画
- 让视图消失
我找到了这个绝妙的来源:http://iosdevtips.co/post/88481653818/twitter-ios-app-bird-zoom-animation
但是这个人使用了面具,我无法更改他的代码来获得 "real" 没有面具的类似 Twitter 的动画,而只是一个动画(放大)图像。
那么如何在当前视图中添加新视图呢?如果我使用子视图,当我需要在 animationDidStop 中删除子视图时,如何在以后的进度中识别该视图?
哦,我很乐意在 AppDelegate 中完成所有这些工作。
这是我目前的做法:
在 AppDelegate 中设置视图:
import UIKit
import QuartzCore
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var viewForLayer: UIView!
var window: UIWindow?
var emoji: CALayer {
return viewForLayer.layer
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// step 1: recreate the launch image
self.emoji.backgroundColor = UIColor(red: 52/255, green: 52/255, blue: 52/255, alpha: 0).CGColor
self.emoji.contents = UIImage(named: "SplashScreenEmoji")!.CGImage
self.emoji.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
self.emoji.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.emoji.position = CGPoint(x: self.window!.frame.size.width/2, y: self.window!.frame.size.height/2)
// self.window!.addSubview(viewForLayer) or
viewForLayer.layer.addSublayer(emoji)
// step 2: add the animation to that view
animateEmoji()
self.window!.makeKeyAndVisible()
UIApplication.sharedApplication().statusBarHidden = true
return true
}
}
对于动画:
func animateEmoji() {
let keyFrameAnimation = CAKeyframeAnimation(keyPath: "bounds")
keyFrameAnimation.delegate = self
keyFrameAnimation.duration = 1
keyFrameAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
let initalBounds = NSValue(CGRect: emoji.bounds)
let secondBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 90, height: 90))
let finalBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 1500, height: 1500))
keyFrameAnimation.values = [initalBounds, secondBounds, finalBounds]
keyFrameAnimation.keyTimes = [0, 0.3, 1]
keyFrameAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
self.emoji.addAnimation(keyFrameAnimation, forKey: "bounds")
}
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
// step 3: remove the view
self.viewForLayer.removeFromSuperview()
}
我总是遇到致命错误:在展开可选值时意外发现 nil,我猜这是因为
var emoji: CALayer {
return viewForLayer.layer
}
我肯定卡住了,需要 Whosebug 社区的帮助,请不要判断,因为我是新来的,只是学习如何编码 swift ;)
谢谢,
乔
很难在此处重现您的错误,但我可以找出源头。
写的时候
var emoji: CALayer {
return viewForLayer.layer
}
然后使用 self.emoji 或
调用此变量
viewForLayer.layer.addSublayer(emoji)
你实际上是在隐式解包变量 viewForLayer,它有一个隐式解包的可选类型 UIView:
var viewForLayer: UIView!
在我看来唯一的解释是,由于某种原因,当你调用它时 viewForLayer 是 nil,这将在隐式解包时准确地导致错误(即以任何方式使用) .我不太了解你的代码,但我看不到你在哪里初始化了 viewForLayer,我的意思是给它一个非零值。
您不需要使用层,只需通过 UIView
s 和 UIView
动画块即可实现缩放效果。
创建一个仅将图像视图添加到其视图的自定义视图控制器,将该视图控制器指定为 window 的 rootViewController
。使用 UIView
动画块来增加图像视图的比例(通过 CGAffineTransform
)。在动画的完成块中,您可以将实际的初始视图控制器分配给 window 的 rootViewController
。
我想为我在 swift 中的 ios 应用程序创建类似 Twitter 的启动图像。
我明白动画启动图像的一般问题,我基本上知道创建这样一个动画的步骤:
- 应用启动后立即添加新视图,内容与启动图像完全相同
- 为该视图设置动画
- 让视图消失
我找到了这个绝妙的来源:http://iosdevtips.co/post/88481653818/twitter-ios-app-bird-zoom-animation
但是这个人使用了面具,我无法更改他的代码来获得 "real" 没有面具的类似 Twitter 的动画,而只是一个动画(放大)图像。
那么如何在当前视图中添加新视图呢?如果我使用子视图,当我需要在 animationDidStop 中删除子视图时,如何在以后的进度中识别该视图?
哦,我很乐意在 AppDelegate 中完成所有这些工作。
这是我目前的做法:
在 AppDelegate 中设置视图:
import UIKit
import QuartzCore
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var viewForLayer: UIView!
var window: UIWindow?
var emoji: CALayer {
return viewForLayer.layer
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// step 1: recreate the launch image
self.emoji.backgroundColor = UIColor(red: 52/255, green: 52/255, blue: 52/255, alpha: 0).CGColor
self.emoji.contents = UIImage(named: "SplashScreenEmoji")!.CGImage
self.emoji.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
self.emoji.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.emoji.position = CGPoint(x: self.window!.frame.size.width/2, y: self.window!.frame.size.height/2)
// self.window!.addSubview(viewForLayer) or
viewForLayer.layer.addSublayer(emoji)
// step 2: add the animation to that view
animateEmoji()
self.window!.makeKeyAndVisible()
UIApplication.sharedApplication().statusBarHidden = true
return true
}
}
对于动画:
func animateEmoji() {
let keyFrameAnimation = CAKeyframeAnimation(keyPath: "bounds")
keyFrameAnimation.delegate = self
keyFrameAnimation.duration = 1
keyFrameAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
let initalBounds = NSValue(CGRect: emoji.bounds)
let secondBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 90, height: 90))
let finalBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 1500, height: 1500))
keyFrameAnimation.values = [initalBounds, secondBounds, finalBounds]
keyFrameAnimation.keyTimes = [0, 0.3, 1]
keyFrameAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
self.emoji.addAnimation(keyFrameAnimation, forKey: "bounds")
}
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
// step 3: remove the view
self.viewForLayer.removeFromSuperview()
}
我总是遇到致命错误:在展开可选值时意外发现 nil,我猜这是因为
var emoji: CALayer {
return viewForLayer.layer
}
我肯定卡住了,需要 Whosebug 社区的帮助,请不要判断,因为我是新来的,只是学习如何编码 swift ;)
谢谢, 乔
很难在此处重现您的错误,但我可以找出源头。
写的时候
var emoji: CALayer {
return viewForLayer.layer
}
然后使用 self.emoji 或
调用此变量viewForLayer.layer.addSublayer(emoji)
你实际上是在隐式解包变量 viewForLayer,它有一个隐式解包的可选类型 UIView:
var viewForLayer: UIView!
在我看来唯一的解释是,由于某种原因,当你调用它时 viewForLayer 是 nil,这将在隐式解包时准确地导致错误(即以任何方式使用) .我不太了解你的代码,但我看不到你在哪里初始化了 viewForLayer,我的意思是给它一个非零值。
您不需要使用层,只需通过 UIView
s 和 UIView
动画块即可实现缩放效果。
创建一个仅将图像视图添加到其视图的自定义视图控制器,将该视图控制器指定为 window 的 rootViewController
。使用 UIView
动画块来增加图像视图的比例(通过 CGAffineTransform
)。在动画的完成块中,您可以将实际的初始视图控制器分配给 window 的 rootViewController
。