swift3.0 项目引导页
项目引导页并不难,使用 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 项目引导页的更多相关文章
- Swift3.0项目学习: 创建撰写按钮
import UIKit class PSMainViewController: UITabBarController { override func viewDidLoad() { super.vi ...
- 用Flutter开发的跨平台项目,完美运行在Android和IOS上,Material简洁风格,包括启动页、引导页、注册、登录、首页、体系、公众号、导航、项目,还有漂亮的妹子图库,运行极度流畅,结构清晰,代码规范,值得拥有
Flutter学习资源汇总持续更新中...... Flutter官方网站 Flutter中文网 wendux的Flutter实战 Flutter官方exampleflutter_gallery 阿里巴 ...
- swift3.0 创建一个app引导页面
swift毕竟不像是oc ,第三方的框架很多,更何况是3.0,自己动手写了个引导页面,看得上我代码的麻友可以拿去用 引导页面有三个部分构成,scrollview用语切换引导视图,pageControl ...
- Android项目实战(三):实现第一次进入软件的引导页
最近做的APP接近尾声了,就是些优化工作了, 我们都知道现在的APP都会有引导页,就是安装之后第一次打开才显示的引导页面(介绍这个软件的几张可以切换的图) 自己做了一下,结合之前学过的 慕课网_Vie ...
- android 项目学习随笔二(引导页 )
1.引导页 1.定义灰色.红色圆点的shape XML文件 2.定义布局文件,利用相对布局文件定位,利用线性布局加载灰色圆点,imageview加载红色圆点 3.android.support.v4. ...
- Android 引导页公共方法LeaderPager
SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 引导页是我们开发app很常用的功 ...
- Xamarin.Android之引导页的简单制作
0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...
- iOS 引导页组件 HcdGuideView
HcdGuideView HcdGuideView让你为你的app添加一个漂亮的启动页变得简单. 要求 Xcode 6 or higher iOS 7.0 or higher ARC 安装方法 手动安 ...
- iOS最好用的引导页
最近项目结束的时候又要改引导页,之前写的启动页改起来太麻烦了,所以就直接封装一个,功能可能还不是很完善,但是感觉用起来也比较方便,在这里和大家分享一下. 这是github的下载地址:https://g ...
随机推荐
- C#如何立即回收内存
1.把对象赋值为null 2.立即调用GC.Collect(); 注意:这个也只是强制垃圾回收器去回收,但具体什么时候执行不确定. 代码: class Test { ~Test() { Consol ...
- SpringMVC 全注解实现 (1) servlet3.0以上的容器支持
一. Spring MVC入门 1.1 request的处理过程 用户每次点击浏览器界面的一个按钮,都发出一个web请求(request).一个web请求的工作就像一个快递员,负责将信息从一个地方运送 ...
- ie下使用文本编辑器导致input文本框无法聚焦的问题原因
最近公司的一个项目遇到一个如下问题: 描述:测试发现,每当我们在发布活动的页面发布完活动后,页面跳转到我的活动,然后再次回到发布活动页面,发现所有的input文本框都不能聚焦.然后再去看看其他页面(我 ...
- 【技巧】断点调试你的express项目
目录(?)[-] 写在前面 node-inspector 全局安装node-inspector 以debug模式开启express服务 启动node-inspector 调试NodeJS程序 写在 ...
- Primer回顾 数组和指针
数组和指针类似于vector和迭代器. 区别在于:数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 设计良好的程序只有在强调速度时才在类实现的 ...
- soap入门篇
摘自:http://blog.csdn.net/erica_1230/article/details/54982081 SOAP的全称是Simple Object Access Protocol,即简 ...
- javascript 函数属性prototype(转)
在JavaScript中并没有类的概念,但javascript中的确可以实现重载,多态,继承.这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释. 1.pro ...
- NSMutableAttributedString及NSMutableParagraphStyle的使用
一.在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较 ...
- Working Experience - WPF 中 DataGrid 控件的应用
问题: 添加控件后, 编辑单元格会出现异常 绑定 ItemsSource 属性后, 更新绑定对象的数据, UI 不刷新 如何显示控件中 ComboBox 类型 解决方法: 绑定 ItemsSource ...
- 深度卷积网络-Inception系列
目录 1. Inception V1 1.1 Inception module 2. Inception V2 3. Inception V3 4. Inception V4, Inception-R ...