项目引导页并不难,使用 UICollectionView就可以完成,

1.首先获取应用程序的版本号,并存入本地,每次有新版本号,和存入本地的版本号,相比较

 fileprivate func setupRootViewController() {

        window = UIWindow(frame: UIScreen.main.bounds)
print(isNewVersion())
window?.rootViewController = isNewVersion() ? NewFeatureController() : UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
if isNewVersion() {
//此处应该加载用户操作教程
}else {
//此处加载广告页面
loadingAdvertisingPages()
}
window?.makeKeyAndVisible()
} /**
判断是否是新版本
*/
fileprivate func isNewVersion() -> Bool {
// 获取当前的版本号 let versionString = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String let currentVersion = Double(versionString)! // 获取到之前的版本号
let versionKey = "curVersion"
let sandboxVersion = UserDefaults.standard.double(forKey: versionKey) // 保存当前版本号
UserDefaults.standard.set(currentVersion, forKey: versionKey)
UserDefaults.standard.synchronize() // 对比
return currentVersion > sandboxVersion
}

新建一个继承  UICollectionViewController 的类,具体的代码如下

import UIKit

private let reuseIdentifier = "Cell"

class NewFeatureController: UICollectionViewController {
fileprivate let itemCount = fileprivate var layout = UICollectionViewFlowLayout()
//MARK: - 系统回调函数
override func viewDidLoad() {
super.viewDidLoad() self.collectionView!.register(NewFeatureCell.self, forCellWithReuseIdentifier: reuseIdentifier)
self.collectionView?.isPagingEnabled = true
self.collectionView?.bounces = false
self.collectionView?.showsHorizontalScrollIndicator = false
self.collectionView?.backgroundColor = UIColor.white
layout.scrollDirection = UICollectionViewScrollDirection.horizontal layout.minimumLineSpacing =
layout.minimumInteritemSpacing =
layout.itemSize = UIScreen.main.bounds.size
} init() {
super.init(collectionViewLayout:layout)
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
} } // MARK: UICollectionViewDataSource
extension NewFeatureController { override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return itemCount
} override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! NewFeatureCell cell.imageIndex = String(indexPath.item)
cell.setIndexPath(indexPath: indexPath, count: itemCount)
return cell } }
import UIKit

class NewFeatureCell: UICollectionViewCell {

    //MARK: - 懒加载属性
fileprivate lazy var imageView: UIImageView = UIImageView() fileprivate lazy var startButton: UIButton = UIButton()
var imageName: String? var imageIndex: String? { didSet { let screenH = UIScreen.main.bounds.height //加载不同的图片
if screenH == {
imageName = imageIndex!+"welcome1136"
}else if screenH == {
imageName = imageIndex!+"welcome1334"
}else {
imageName = imageIndex!+"welcome1472"
} imageView.image = UIImage(named: imageName!) }
} //MARK: - 构造函数 override init(frame: CGRect) {
super.init(frame: frame) setupUI()
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} } //MARK: - 设置 UI界面相关
extension NewFeatureCell { fileprivate func setupUI() { startButton.setTitle("开始全新体验", for: .normal)
startButton.setTitleColor(UIColor.orange, for: .normal)
startButton.sizeToFit()
startButton.isHidden = true
startButton.addTarget(self, action: #selector(NewFeatureCell.startBtnClick), for: .touchUpInside)
self.contentView .addSubview(imageView)
self.contentView.addSubview(startButton) } //布局子控件的 frame
override func layoutSubviews() {
super.layoutSubviews()
imageView.frame = self.bounds startButton.center = CGPoint(x: self.bounds.width * 0.5, y: self.bounds.height * 0.9)
} func setIndexPath(indexPath: IndexPath, count: Int) {
if indexPath.item == count- {
startButton.isHidden = false
}else {
startButton.isHidden = true
}
} } //MARK: - 事件的点击
extension NewFeatureCell { @objc fileprivate func startBtnClick() {
UIApplication.shared.keyWindow?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() }
}

swift3.0 项目引导页的更多相关文章

  1. Swift3.0项目学习: 创建撰写按钮

    import UIKit class PSMainViewController: UITabBarController { override func viewDidLoad() { super.vi ...

  2. 用Flutter开发的跨平台项目,完美运行在Android和IOS上,Material简洁风格,包括启动页、引导页、注册、登录、首页、体系、公众号、导航、项目,还有漂亮的妹子图库,运行极度流畅,结构清晰,代码规范,值得拥有

    Flutter学习资源汇总持续更新中...... Flutter官方网站 Flutter中文网 wendux的Flutter实战 Flutter官方exampleflutter_gallery 阿里巴 ...

  3. swift3.0 创建一个app引导页面

    swift毕竟不像是oc ,第三方的框架很多,更何况是3.0,自己动手写了个引导页面,看得上我代码的麻友可以拿去用 引导页面有三个部分构成,scrollview用语切换引导视图,pageControl ...

  4. Android项目实战(三):实现第一次进入软件的引导页

    最近做的APP接近尾声了,就是些优化工作了, 我们都知道现在的APP都会有引导页,就是安装之后第一次打开才显示的引导页面(介绍这个软件的几张可以切换的图) 自己做了一下,结合之前学过的 慕课网_Vie ...

  5. android 项目学习随笔二(引导页 )

    1.引导页 1.定义灰色.红色圆点的shape XML文件 2.定义布局文件,利用相对布局文件定位,利用线性布局加载灰色圆点,imageview加载红色圆点 3.android.support.v4. ...

  6. Android 引导页公共方法LeaderPager

    SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 引导页是我们开发app很常用的功 ...

  7. Xamarin.Android之引导页的简单制作

    0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...

  8. iOS 引导页组件 HcdGuideView

    HcdGuideView HcdGuideView让你为你的app添加一个漂亮的启动页变得简单. 要求 Xcode 6 or higher iOS 7.0 or higher ARC 安装方法 手动安 ...

  9. iOS最好用的引导页

    最近项目结束的时候又要改引导页,之前写的启动页改起来太麻烦了,所以就直接封装一个,功能可能还不是很完善,但是感觉用起来也比较方便,在这里和大家分享一下. 这是github的下载地址:https://g ...

随机推荐

  1. configured to save RDB snapshots, but is currently not able to persist o...

    Redis问题 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on d ...

  2. 几个重要的 ASM Disk Groups 参数

    几个重要的Disk group 属性: 1. ACCESS_CONTROL.ENABLED该属性用来控制某个disk group 上ASM FILE Access Control. 该参数有2个值:t ...

  3. bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...

  4. Oracle的case 用法

    1.测试表declare @stuinfo table(id int, sname nvarchar(20), ///小组名称 gender varchar(1), //小组性别 sgroup int ...

  5. IoT:template

    ylbtech-IoT: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cnb ...

  6. Jenkins安装配置简单使用

    安装启动是十分简单的,直接去https://jenkins.io/download/下载对应的rpm包就好了,需要注意的是我们的机器上要提前有java环境,相对应要选择你java环境可以支持的jenk ...

  7. Angular 2 ViewChild & ViewChildren

    一.ViewChild ViewChild 是属性装饰器,用来从模板视图中获取匹配的元素.视图查询在 ngAfterViewInit 钩子函数调用前完成,因此在 ngAfterViewInit 钩子函 ...

  8. DefaultTableCellRenderer 自定义

    方式一: DefaultTableCellRenderer render = new DefaultTableCellRenderer(); render.setHorizontalAlignment ...

  9. AngularJs(Part 1)

    I am tired to translate these into Chinese. but who cares? i write these posts just for myself Scope ...

  10. /dev/mapper/vg_zjxtest-lv_root 占用到达100%的解决方法

    linux系统下报这个错误是磁盘满了,可以先做以下几个检查: 1.查看下面这个目录看看是否是回收站满了 du -sh ~/.local/share/Trash 2.查看/tmp目录和/var目录是否有 ...