前言
断断续续的已经学习Swift
一年多了, 从1.2
到现在的2.2
, 一直在语法之间徘徊, 学一段时间, 工作一忙, 再捡起来隔段时间又忘了.思来想去, 趁着这两个月加班不是特别多, 就决定用swift
仿写一个完整项目.
1 2 3 4 |
花田小憩:是一个植物美学生活平台, 以自然生活为主导, 提倡植物学生活方法, 倡导美学标准的生活态度的一个APP. |
个人文字功底有限, 就我而言, 这款APP做的挺唯美
的…
github地址
声明
此花田小憩
项目里面的都是真实接口, 真实数据, 仅供学习, 毋作其他用途!!!
项目部分截图
由于项目的大体功能都已经实现了的, 所以整个项目还是比较庞大的.所以, 下面罗列部分功能的截图.
由于gif录制的时候, 会重新渲染一遍图片, 所以导致项目中用到高斯模糊
的地方, 看起来感觉比较乱, 实际效果还是不错的.
新特性
首页
详情页
评论
分享
商城首页
商城详情页
商品搜索
支付
图片浏览器
专栏作家
个人中心
项目环境
编译器 : Xcode7.3及以上
语言 : Swift2.2
整个项目都是采用纯代码
开发模式
tip: 之前编译环境这儿有点错误, 因为我项目中用了Swift2.2的特性, 2.2之后方法名需要写成#selector(AddAddressViewController.save)
, 不再使用双引号了
第三方框架
1 2 3 4 5 6 7 8 9 10 |
use_frameworks! platform :ios, "8.0" target 'Floral' do pod 'SnapKit', '~> 0.20.0' ## 自动布局 pod 'Alamofire', '~> 3.3.1' ## 网络请求, swift版的AFN pod 'Kingfisher', '~> 2.3.1' ## 轻量级的SDWebImage end |
还用到了MBProgressHUD
.
除此之外,几乎全部都是自己造的小轮子
…
目录结构详解
Classes
下包含7个功能目录:
①Resources
: 项目用到的资源,包含plist文件
, js文件
和字体
②Network
: 网络请求, 所有的网络请求都在这里面, 接口
和参数
都有详细的注释
③Tool
: 包含tools(工具类)
, 3rdLib(第三方:友盟分享, MBProgressHUD )
, Category(所有项目用到的分类)
④Home
: 首页(专题), 包含专题分类
, 详情
, 每周Top10
, 评论
, 分享
等等功能模块
⑤Main
: UITabBarController
, UINavigationController
设置以及新特性
⑥Malls
: 商城, 包含商城分类
, 商品搜索
, 详情
, 购物车
, 购买
, 订单
, 地址管理
, 支付
等等功能模块
⑦Profile
: 个人中心, 专栏作者, 登录/注册/忘记密码, 设置等功能模块
大家可以下载项目, 对照这个目录结构进行查看, 很典型的MVC
文件结构, 还是很方便的.
项目部分功能模块详解
① 新特性NewFeatureViewController
: 这个功能模块还是比较简单的, 用到了UICollectionViewController
, 然后自己添加了UIPageControl
, 只需要监听最后一个cell的点击即可.
这儿有一个注意点是: 我们需要根据版本号来判断是进入新特性界面, 广告页还是首页.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private let SLBundleShortVersionString = "SLBundleShortVersionString" // MARK: - 判断版本号 private func toNewFeature() -> Bool { // 根据版本号来确定是否进入新特性界面 let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String let oldVersion = NSUserDefaults.standardUserDefaults().objectForKey(SLBundleShortVersionString) ?? "" // 如果当前的版本号和本地保存的版本比较是降序, 则需要显示新特性 if (currentVersion.compare(oldVersion as! String)) == .OrderedDescending{ // 保存当前的版本 NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey: SLBundleShortVersionString) return true } return false } |
② 下拉刷新RefreshControl
: 在这个项目中, 没有用第三方的下拉刷新控件, 而是自己实现了一个简单的下拉刷新轮子, 然后赋值给UITableViewController
的public var refreshControl: UIRefreshControl?
属性. 主要原理就是判断下拉时的frame
变化:
1 2 |
// 监听frame的变化 addObserver(self, forKeyPath: "frame", options:.New, context: nil) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
个人文字功底有限, 就我而言, 这款APP做的挺 github地址声明此 项目部分截图由于项目的大体功能都已经实现了的, 所以整个项目还是比较庞大的.所以, 下面罗列部分功能的截图. 新特性 首页 详情页 评论 分享 商城首页 商城详情页 商品搜索 支付 图片浏览器 专栏作家 个人中心 项目环境编译器 : Xcode7.3及以上 语言 : Swift2.2 整个项目都是采用 tip: 之前编译环境这儿有点错误, 因为我项目中用了Swift2.2的特性, 2.2之后方法名需要写成 第三方框架
还用到了 目录结构详解
① ② ③ ④ ⑤ ⑥ ⑦ 大家可以下载项目, 对照这个目录结构进行查看, 很典型的 项目部分功能模块详解① 新特性
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private let SLBundleShortVersionString = "SLBundleShortVersionString" // MARK: - 判断版本号 private func toNewFeature() -> Bool { // 根据版本号来确定是否进入新特性界面 let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String let oldVersion = NSUserDefaults.standardUserDefaults().objectForKey(SLBundleShortVersionString) ?? "" // 如果当前的版本号和本地保存的版本比较是降序, 则需要显示新特性 if (currentVersion.compare(oldVersion as! String)) == .OrderedDescending{ // 保存当前的版本 NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey: SLBundleShortVersionString) return true } return false } |
② 下拉刷新RefreshControl
: 在这个项目中, 没有用第三方的下拉刷新控件, 而是自己实现了一个简单的下拉刷新轮子, 然后赋值给UITableViewController
的public var refreshControl: UIRefreshControl?
属性. 主要原理就是判断下拉时的frame
变化:
1 2 |
// 监听frame的变化 addObserver(self, forKeyPath: "frame", options:.New, context: nil) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |