代码地址如下:
http://www.demodashi.com/demo/12090.html

准备工作

首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的。一般启动屏展示会有上下两部分,上面是宣传图片,下面是 App 的 Logo。

实现思路

在 LaunchScreen 结束后,在 AppDelegate 中将 rootViewController 指向展示广告用的 AdViewController,在AdViewController 中设置一段时间后自己销毁,并提供回调方法在 AppDelegate 中将 rootViewController 指向 App 真正的首页。

文件目录结构

实现细节

  1. 新建一个 AdViewController 用于放置广告宣传等展示.注意有一个回调方法。
class AdViewController: UIViewController {// 用于 AdViewController 销毁后的回调var completion: (() -> Void)?var adImage: UIImage?var adView: UIImageView?override func viewDidLoad() {// ....}
}

在 ViewDidLoad 方法中配置广告图,同时判断 iPhoneX的特殊情况

```Swift
override func viewDidLoad() {super.viewDidLoad()var adViewHeight = (1040 / 720) * screenWidthvar imageName = "start_page"if UIDevice.isiPhoneX() {adViewHeight = (1920 / 1124) * screenWidthimageName = "start_page_x"}adView = UIImageView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: adViewHeight))adView?.image = UIImage(named: imageName)adView?.contentMode = .scaleAspectFillself.view.addSubview(adView!)let bottomHolderView = UIView(frame: CGRect(x: 0, y: screenHeight-120, width: screenWidth, height: 120))self.view.addSubview(bottomHolderView)let logo = UIImageView(frame: CGRect(x: (screenWidth-120)/2, y: (120-50)/2, width: 120, height: 50))logo.image = UIImage(named: "start_logo")bottomHolderView.addSubview(logo)let time: TimeInterval = 1.0DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) {self.dismissAdView()}
}
```

上面代码中有几个注意的:
因为图片要撑满屏幕的宽度,所以宽度是固定的,根据图片的高宽比,算出图片实际应有的高度,这样图片可以在各个尺寸的 iPhone 中才不会因为拉伸而变形。但是因为 iPhoneX 特殊的宽高比,所以还是要为它特定一张图片,不然即使图片在 iPhoneX 上不变形,图片所占的高度会太小,或者顶部被刘海遮挡内容而不美观。

```Swift
var adViewHeight = (1040 / 720) * screenWidth
var imageName = "start_page"
if UIDevice.isiPhoneX() {adViewHeight = (1920 / 1124) * screenWidthimageName = "start_page_x"
}
```

上面判断是否为 iPhoneX 我是在 UIDevice 里扩展了一个方法:

extension UIDevice {public static func isiPhoneX() -> Bool {if UIScreen.main.bounds.height == 812 {return true}return false}
}

还有注意在执行销毁时调用回调方法

let time: TimeInterval = 1.0
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time) {self.dismissAdView()
}
  1. 在 AppDelegate 中 didFinishLaunchingWithOptions 方法中调用下面的 setUpWindowAndRootView() 来管理页面展示
extension AppDelegate {func setUpWindowAndRootView() {window = UIWindow(frame: UIScreen.main.bounds)window!.backgroundColor = UIColor.whitewindow!.makeKeyAndVisible()let adVC = AdViewController()adVC.completion = {let vc = ViewController()vc.adView = adVC.viewself.window!.rootViewController = vc}window!.rootViewController = adVC}
}

注意在 AdViewController 销毁的回调方法中,将 AdViewController 的 view 传给真正的首页,让首页来执行动画

adVC.completion = {let vc = ViewController()// 将 AdViewController 的 view 传给真正的首页,让首页来执行动画vc.adView = adVC.viewself.window!.rootViewController = vc
}
  1. 在首页 ViewController 里我们有如下方法来执行 AdViewController 的销毁动画,这里配置的动画是常见的扩大渐变消失
private var advertiseView: UIView?var adView: UIView? {didSet {advertiseView = adView!advertiseView?.frame = self.view.boundsself.view.addSubview(advertiseView!)UIView.animate(withDuration: 1.5, animations: { [weak self] inself?.advertiseView?.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)self?.advertiseView?.alpha = 0}) { [weak self] (isFinish) inself?.advertiseView?.removeFromSuperview()self?.advertiseView = nil}}}

至此,一个简单的启动屏动画就完成了,下面可以看看效果图:

iOS 实现启动屏动画(Swift实现,包含图片适配)

代码地址如下:
http://www.demodashi.com/demo/12090.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS 实现启动屏动画(Swift实现,包含图片适配)相关推荐

  1. android引导页图片全屏适配,关于图片适配不同尺寸的image View(实战)

    分享人:广州华软佐罗 一. 前言 在前端开发过程中,设计稿中往往只提供一张图片,但是app内需要用到的尺寸各种各样. 同时图片不仅是信息的直接表达,也会为网站起到美观点缀的作用,图片的变形.过分裁切会 ...

  2. IOS解决闪屏无效LuanchImage启动动画设置加载广告闪屏图

    IOS闪屏动画LuanchImage设置无效 设置Launch Image无效 其它方法 转载请标明出处: https://dujinyang.blog.csdn.net/article/detail ...

  3. [UWP小白日记-10]程序启动屏(ios解锁既视感)

    [UWP小白日记-10]程序启动屏(ios解锁既视感) 原文:[UWP小白日记-10]程序启动屏(ios解锁既视感) 讲一下 微软爸爸的开发者大会2016又暴了个表达式动画和Windows.UI.Co ...

  4. 【SwiftUI模块】0008、SwiftUI-自定义启动闪屏动画-App启动闪屏曲线路径动画

    SwiftUI小功能模块系列 0001.SwiftUI自定义Tabbar动画效果 0002.SwiftUI自定义3D动画导航抽屉效果 0003.SwiftUI搭建瀑布流-交错网格-效果 0004.Sw ...

  5. android 启动白屏_从细节入手改善用户体验,Flutter跨平台App开发中设置Android和iOS的启动页

    前言 flutter开发App方便快捷,就是冷启动的时候要加载dart引擎有短暂的白屏,严重影响用户体验,这个时候我们就需要设置一个启动图片,想国内大部分App那样(例如微信那个地球),启动App的时 ...

  6. [Unity实战]仅需25行代码 安卓/ios打包跳过Unity启动Logo动画...[新手开箱可用][全平台支持]

    [Unity实战]仅需25行代码 安卓/ios打包跳过Unity启动Logo动画 参考文章 接上一篇文章-unity隐私协议包通过审查 1.直接上代码: 2.打包后使用效果展示: 3.源码地址: 参考 ...

  7. android oreo 开机动画,Android O添加了一个 Splash Screen API帮助简化启动屏制作

    大多数开发者对闪屏(splash screen)都持不同的态度.一些人支持用闪屏隐藏app的加载,然后自然过渡到主界面,而另一些人认为闪屏不管是对用户还是开发者都是浪费时间.谷歌在这个问题上的立场也是 ...

  8. iOS 自定义转场动画实现小红书的push效果思路以及下雪碎屏等动画的实现

    感觉好久没写会动的Demo了,前几天写了很久的Block源码分析,分析了几天整个人都不好了,都不知道block是什么了......,有需要的同学可以去看看,简直不要太简单Block是什么鬼毕竟也是做电 ...

  9. 马蜂窝 iOS App 启动治理:回归用户体验

    增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...

最新文章

  1. 【微信小程序企业级开发教程】页面的生命周期和参数传递
  2. javaScript tips —— z-index 对事件机制的影响
  3. python实现双向最大匹配法
  4. jQuery全选反选实例
  5. 把 charles,Fiddler 证书安装到安卓根目录,解决安卓微信 7.0 版本以后安装证书也无法抓包问题,需要 root
  6. 计算机多重网络intnet,南昌大学计算机网络实验(全).doc
  7. Eclipse中Tab的配置(设置为按一下Tab键,效果是按4次空格,而不是4个空格的缩进)
  8. PHP连接不上MySQL解决方案总结
  9. linux mint 19安装 kvm 软件包
  10. 马云重构阿里:或分拆成30家公司 整合3家上市
  11. DSP 脉冲检测CAP
  12. 小朋友把游戏藏在计算机里,给两、三岁宝宝的60个超简单家庭早教游戏
  13. INS防封号技巧,这些注意事项如果你不知道容易被封号停用
  14. 5G技术发展的发展现状,未来发展有哪些关键点和趋势
  15. 删除服务残留注册表_强制卸载软件程序、清理注册表的好工具
  16. 连接HiveServer2的图形化工具SQuirrel和Dbeaver
  17. Linux【搭建环境与基本指令】
  18. python可视化编程(pyQT designer)安装及入门教程
  19. Ubuntu16.04的安装教程
  20. ORACLE删除字段(setnbsp;unused…

热门文章

  1. vs2015打开EXCEL文档范例及其注意事项!!!
  2. 5009. tinyfsm有限状态机
  3. python 列表推导式csv_Python 列表推导式
  4. smb服务器速度测试_通过 SMB 直通优化文件服务器的性能 | Microsoft Docs
  5. Linux并发与竞争
  6. 百度android定位 602 key mcode不匹配,我的Android进阶之旅------百度地图学习:BDLocation.getLocType ( )值分析...
  7. Redis和Memcache区别
  8. JSON解析工具比较,主要GSON和FastJSON
  9. 解决maven加载不了oracle jdbc驱动包的问题
  10. 开发利器JRebel部署SpringBoot项目