本文为参考学习的文章,在阅读这位作者的源码之后学习到的一个小方法。
解决方案
在 iOS 中,为应用设置启动页非常简单。按照 Apple 的意思,启动页应当尽可能的与首屏相似,并且尽可能的避免使用启动动画。但是有时候我们想让启动页稍微丰富一些,为它添加一些事情。
在之前,我的做法是(OC)
在 AppDelegate 中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
方法中添加动画效果,具体实现如下:
- 获取 LaunchScreen 中的 view(这需要你的应用启动页设置为 LaunchScreen)
UIViewController *viewController = [[UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil] instantiateViewControllerWithIdentifier:@"LaunchScreen"];
UIView *launchView = viewController.view;
- 将 view 添加到 window 上
[self.window addSubview:launchView];
- 实现 view 的动画
[UIView animateWithDuration:1.3f delay:0.1f options:UIViewAnimationOptionBeginFromCurrentState animations:^{
launchView.alpha = 0.0f;
launchView.layer.transform = CATransform3DScale(CATransform3DIdentity, 1.3f, 1.3f, 1.0f);
} completion:^(BOOL finished) {
[launchView removeFromSuperview];
}];
这里将 view 放大显示并且同时消失,记得在动画结束时将 view 移除掉。
新的小方法是(swift)
上述方法将启动页的 ViewController 拿到,所以可以将其上的多个控件一起处理,形成比较和谐的效果。但是也有很多启动页都由一张图片构成,所以在这里,我们可以直接拿到图片,进行处理。
- 一个获取启动图片的函数(这谜一般的对齐)
func launchImage() -> UIImage {
var launchImage : UIImage!
var viewOrientation : String!
let viewSize = UIScreen.main.bounds.size
let orientation = UIApplication.shared.statusBarOrientation
// 获取屏幕方向
if orientation == .landscapeLeft || orientation == .landscapeRight {
viewOrientation = "Landscape"
} else {
viewOrientation = "Portrait"
}
let imagesInfo = Bundle.main.infoDictionary!["UILaunchImages"]
for dic: Dictionary<String, String> in imagesInfo as! Array {
let imageSize = CGSizeFromString(dic["UILaunchImageSize"]!)
if imageSize.equalTo(viewSize) && viewOrientation == dic["UILaunchImageOrientation"]! as String {
launchImage = UIImage(named: dic["UILaunchImageName"]!)
}
}
return launchImage
}
在这里,获取的是 Assets 中的启动页。
- 在 viewDidLoad() 中添加 UIImageView,设置图片
override func viewDidLoad() {
super.viewDidLoad()
// 添加启动页
let launchImageView = UIImageView(frame: self.view.bounds)
launchImageView.image = self.launchImage()
view.addSubview(launchImageView)
UIView.animate(withDuration: 1, delay: 1, options: .curveEaseIn, animations: {
launchImageView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
launchImageView.alpha = 0
}) { (finished) in
launchImageView.removeFromSuperview()
}
}
- 动画处理,同上。
遇到的问题
在处理第二种方案时,发现这个动画只能加在 Initial View Controller 中,否则动画没有效果。
总结
其实在 LaunchScreen 配置启动页较为简便,只需要一个图片即可,并且可以控制各个控件,相对灵活。但是刚刚打开之前的代码运行时发现一个问题。。。各取所需吧。
网友评论