前言
最近学习了swift5,使用WanAndroid开放API 制作了一个简易APP练手,实现了一些常用的功能(新手练习还是不错的),UI页面制作的不是很精美,还请见谅!
项目截图
主要功能
- 首页、项目、热门、我的四大模块;
- 登录注册功能;
- 搜索功能:热门搜索、搜索历史;
- 文章列表,网格布局;
- Tab切换功能
- 自动轮播图
- 自定义的上/下拉刷新
- Toast提醒
- 网络请求封装
- 常用view扩展
主要开源框架
- pod 'Moya'//网络二次封装
- pod 'PrintBeautifulLog'
- pod 'Alamofire' #网络, '~> 4.7'
- pod 'MJRefresh' #刷新
- pod 'LLCycleScrollView' #轮播
- pod 'EmptyDataSet-Swift'
- pod 'MBProgressHUD'
- pod 'HandyJSON'
- pod 'Kingfisher' #图片
- pod 'Then' #语法糖
- pod 'SnapKit', '~> 4.2.0'
- pod 'SnapKitExtend' #自动布局扩展
- pod 'SVProgressHUD'
- pod 'MBProgressHUD'
- pod 'Reusable' #可复用
- pod 'Tabman' #tab导航
- pod 'JXSegmentedView'
- pod 'Toast-Swift’, '~> 5.0.1'
main代码
class MainViewController: UITabBarController ,UINavigationControllerDelegate{
override func viewDidLoad() {
super.viewDidLoad()
createTabs();
// 这样设置就有效果了。 但是看到源码注释的意思是针对整个TabBar的设置的 - -!
UITabBar.appearance().tintColor = UIColor.red
}
// 去搜索页面
@objc func clickSearch(){
//self.navigationController?.pushViewController(SearchArcticleViewController(), animated: true)
}
// 创建 tabs
func createTabs(){
// 主页 Tab VC
let homeVC = HomeVC();
homeVC.tabBarItem = UITabBarItem(title: "主页", image: UIImage(named: "home_tabbar_night_32x32_"),
selectedImage: UIImage(named: "home_tabbar_press_32x32_"));
let homeNVC = UINavigationController(rootViewController: homeVC);
// homeNVC.navigationItem.title = "主页";
// 知识体系
let knowledgeVC = ProjectVC();
knowledgeVC.tabBarItem = UITabBarItem(title: "项目", image: UIImage(named: "huoshan_tabbar_night_32x32_"),
selectedImage: UIImage(named: "huoshan_tabbar_press_32x32_"));
let knowledgeNVC = UINavigationController(rootViewController: knowledgeVC);
// 热门
let hotVC = HotTabVC();
hotVC.tabBarItem = UITabBarItem(title: "热门", image: UIImage(named: "weitoutiao_tabbar_night_32x32_"),
selectedImage: UIImage(named: "weitoutiao_tabbar_press_32x32_"));
let hotNVC = UINavigationController(rootViewController: hotVC);
// 我的
let myVC = MyTabViewVC()
myVC.tabBarItem = UITabBarItem(title: "我的", image: UIImage(named: "mine_tabbar_night_32x32_"),
selectedImage: UIImage(named: "mine_tabbar_press_32x32_"))
let myNVC = UINavigationController(rootViewController: myVC)
self.viewControllers = [homeVC, knowledgeVC, hotVC, myVC];
}
}
复制代码
HttpUtils网络请求封装
enum MethodType {
case get
case post
}
class HttpUtils {
class func requestData<T:HandyJSON> (url : String ,type : MethodType ,params : [String:Any]? = nil,
callBack : @escaping (_ result : T?) -> ()) {
let method = type == .get ? HTTPMethod.get :HTTPMethod.post
let headers: HTTPHeaders = [
"Cookie": ""
]
print("请求URL-----\(baseUrl+url)")
Alamofire.request(baseUrl+url, method: method, parameters: params, encoding: URLEncoding.default
, headers: nil).responseJSON {(response) in
//1。校验结果 response.result.isSuccess
guard let result = response.result.value else {
callBack(nil)
print("请求失败\(response.result.error)")
return
}
//2.结果回调回去
// callBack(result)
let model = JSONDeserializer<BaseResponse<T>>.deserializeFrom(dict: result as? [String : Any] )
callBack(model?.data)
print("请求成功-----\(response.request?.url)")
//print(response.result.value)
MyLog(log: response.result.value)
}
}
class func requestDataArray<T:HandyJSON> (url : String ,type : MethodType ,params : [String:Any]? = nil,
callBack : @escaping (_ result : [T]?) -> ()) {
let method = type == .get ? HTTPMethod.get :HTTPMethod.post
let headers: HTTPHeaders = [
"Cookie": ""
]
print("请求URL-----\(baseUrl+url)")
Alamofire.request(baseUrl+url, method: method, parameters: params, encoding: URLEncoding.default
, headers: nil).responseJSON {(response) in
//1。校验结果 response.result.isSuccess
guard let result = response.result.value else {
callBack(nil)
print("请求失败\(response.result.error)")
return
}
//2.结果回调回去
// callBack(result)
let model = JSONDeserializer<BaseResponseArray<T>>.deserializeFrom(dict: result as? [String : Any] )
callBack(model?.data)
print("请求成功-----\(response.request?.url)")
//print(response.result.value)
MyLog(log: response.result.value)
}
}
}
复制代码
UILabel扩展
import UIKit
extension UILabel{
/**
UILabel遍历构造器
- parameter text : 文字
- parameter textColor : 文字颜色
- parameter fontSize : 文字大小
- parameter numOfLines : 文字行数
- parameter alignment : 对齐方式
*/
convenience init(text:String?,
_ textColor:UIColor = UIColor.darkGray,
_ fontSize:CGFloat = 16,
_ numOfLines:Int = 0,
_ alignment:NSTextAlignment = .left) {
self.init()
self.text = text
self.textColor = textColor
self.font = UIFont.systemFont(ofSize: fontSize)
self.numberOfLines = numOfLines
self.textAlignment = alignment
self.sizeToFit()
}
}
/**
//UILabel自适应高度
- parameter label : UILabel控件
- parameter width : 文字显示的宽度
- parameter style : 文字样式(包括行高,字间距等,不设置计算会不准确)
let style = NSMutableParagraphStyle.init()
//行间距
style.lineSpacing = 10
label.attributedText = NSAttributedString(string: string, attributes: [NSAttributedString.Key.paragraphStyle: style])
//高度自适应
let boundingRect = autoLabel(label: label,width: screenWidth-40,style: style)
label.frame = CGRect(x: 20, y: navHeight+100, width: boundingRect.width, height: boundingRect.height)
*/
func autoLabel(label:UILabel , width:CGFloat,style:NSMutableParagraphStyle)-> CGRect{
let options: NSStringDrawingOptions = .usesLineFragmentOrigin
let str: NSString = label.text! as NSString
let boundingRect = str.boundingRect(with: CGSize(width: width, height: 0), options: options, attributes: [NSAttributedString.Key.font:label.font, NSAttributedString.Key.paragraphStyle:style], context: nil)
return boundingRect
}
复制代码
UIColor扩展
import UIKit
extension UIColor {
convenience init(r:UInt32 ,g:UInt32 , b:UInt32 , a:CGFloat = 1.0) {
self.init(red: CGFloat(r) / 255.0,
green: CGFloat(g) / 255.0,
blue: CGFloat(b) / 255.0,
alpha: a)
}
}
//MRAK: 应用默认颜色
extension UIColor {
class var background: UIColor {
return UIColor(r: 242, g: 242, b: 242)
}
class var theme: UIColor {
return UIColor(r: 29, g: 221, b: 43)
}
/**
获取颜色,通过16进制色值字符串,e.g. #ff0000, ff0000
- parameter hexString : 16进制字符串
- parameter alpha : 透明度,默认为1,不透明
- returns: RGB
*/
static func withHex(hexString hex: String, alpha:CGFloat = 1) -> UIColor {
// 去除空格等
var cString: String = hex.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines).uppercased()
// 去除#
if (cString.hasPrefix("#")) {
cString = (cString as NSString).substring(from: 1)
}
// 必须为6位
if (cString.count != 6) {
return UIColor.gray
}
// 红色的色值
let rString = (cString as NSString).substring(to: 2)
let gString = ((cString as NSString).substring(from: 2) as NSString).substring(to: 2)
let bString = ((cString as NSString).substring(from: 4) as NSString).substring(to: 2)
// 字符串转换
var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0
Scanner(string: rString).scanHexInt32(&r)
Scanner(string: gString).scanHexInt32(&g)
Scanner(string: bString).scanHexInt32(&b)
return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: alpha)
}
/**
获取颜色,通过16进制数值
- parameter hexInt : 16进制数值
- parameter alpha : 透明度
- returns : 颜色
*/
static func withHex(hexInt hex:Int32, alpha:CGFloat = 1) -> UIColor {
let r = CGFloat((hex & 0xff0000) >> 16) / 255
let g = CGFloat((hex & 0xff00) >> 8) / 255
let b = CGFloat(hex & 0xff) / 255
return UIColor(red: r, green: g, blue: b, alpha: alpha)
}
/**
获取颜色,通过rgb
- parameter red : 红色
- parameter green : 绿色
- parameter blue : 蓝色
- returns : 颜色
*/
static func withRGB(_ red:CGFloat, _ green:CGFloat, _ blue:CGFloat) -> UIColor {
return UIColor.withRGBA(red, green, blue, 1)
}
/**
获取颜色,通过rgb
- parameter red : 红色
- parameter green : 绿色
- parameter blue : 蓝色
- parameter alpha : 透明度
- returns : 颜色
*/
static func withRGBA(_ red:CGFloat, _ green:CGFloat, _ blue:CGFloat, _ alpha:CGFloat) -> UIColor {
return UIColor(red: red / 255, green: green / 255, blue: blue / 255, alpha: alpha)
}
}
复制代码