新手练习Swift5编写的WanAndroid项目(纯代码)

前言

最近学习了swift5,使用WanAndroid开放API 制作了一个简易APP练手,实现了一些常用的功能(新手练习还是不错的),UI页面制作的不是很精美,还请见谅!

Github源码地址

项目截图

主要功能

  • 首页、项目、热门、我的四大模块;
  • 登录注册功能;
  • 搜索功能:热门搜索、搜索历史;
  • 文章列表,网格布局;
  • 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)
  }
}
复制代码

猜你喜欢

转载自juejin.im/post/7013281350870548511