美文网首页
iOS组件化(单页面设计)

iOS组件化(单页面设计)

作者: libtinker | 来源:发表于2023-03-22 17:14 被阅读0次

其实抓下京东app的首页,或者别的大型项目的首页啥的,一般会抓到多个页面相关的接口,例如轮播图的、数据列表、等等。
很多app会把所有接口请求完才展示数据,如果其中有一个错误就整个页面展示错误页面,我感觉这是对好的接口的一种浪费,所以我感觉应该做到 请求到一个就展示一个接口的数据;比如说轮播图请求成功就展示轮播图的 没请求成功的在相关的UI模块展示没成功的错误页面。
废话不说了,上代码;举例 加载框吧‘


WechatIMG8.png

先看使用

    func loadAData() {
        aView.showLoadingView()
        RequestManager.request(path: "xxx/project-list", parameters: nil) { result in
            aView.view.hiddenLoadingView()
            switch result {
            case .success(let data) :
               self.updateUI(data: data)             
                let state:EmptyViewState = list.count == 0 ? .emptyData : .none
                aView.showEmptyView(state: state) {
                    self.loadAData()
                }
                break
            case .failure(let error):
                aView.showEmptyView(state: error.toEmptyState()) {
                    self.loadAData()
                }
                aView.showToast(message: error.msg)
                break
            }
        }
    }

实现

//
//  TKHUD.swift
//  模块开发
//
//  Created by 天空吸引我 on 2020/6/11.
//  Copyright © 2020 libtinker. All rights reserved.
//

import UIKit

class TKHUD:UIView {

   lazy var messageLabel:UILabel = {
        let label = UILabel()
        label.font = UIFont.systemFont(ofSize: 14.0)
        label.textColor = UIColor.white
        label.layer.masksToBounds = true
        label.numberOfLines = 0
        label.textAlignment = .center
       return label
    }()
    
    lazy var contentView:UIView = {
        let view = UIView()
        view.frame = CGRect.init(x: 0, y: 0, width: 100, height: 100)
        view.backgroundColor = UIColor.init(red: 58/255.0, green: 59/255.0, blue: 73/255.0, alpha: 1.0).withAlphaComponent(0.5)
        view.layer.cornerRadius = 4.0
        self.addSubview(view)
        return view
    }()
        
    lazy var activityIndicatorView:UIActivityIndicatorView = {
        let activityIndicatorView = UIActivityIndicatorView()
        activityIndicatorView.frame = CGRect.init(x: 10, y: 10, width: 80, height: 80)
        activityIndicatorView.color = UIColor.white
        if #available(iOS 13.0, *) {
            activityIndicatorView.style = .large
        } else {
            activityIndicatorView.style = .whiteLarge
        }
        self.addSubview(activityIndicatorView)
        return activityIndicatorView
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        self.isUserInteractionEnabled = false
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    public func addLoadingView() {
        self.contentView.addSubview(self.activityIndicatorView)
        self.contentView.center = self.center
        self.activityIndicatorView.startAnimating()
    }

    public func addToastView(message:String) {
        self.contentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        let boundingRect = message.boundingRect(with: CGSize(width: self.bounds.size.width-90, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes:[NSAttributedString.Key.font:UIFont.systemFont(ofSize: 14)], context: nil)
        self.contentView.frame = CGRect.init(x: 0, y: 0, width: self.bounds.size.width-60, height: boundingRect.height+20)
        self.contentView.center = self.center;
        
        self.messageLabel.text = message
        self.contentView.addSubview(self.messageLabel)
        self.messageLabel.frame = CGRect(x: (self.contentView.bounds.size.width-boundingRect.width)/2, y: (self.contentView.bounds.size.height-boundingRect.height)/2, width: boundingRect.width, height:boundingRect.height)
    }
}

extension UIView {
    public func showLoadingView(){
        let loadingView = TKHUD(frame: self.bounds)
        loadingView.addLoadingView()
        self.addSubview(loadingView);
    }
    
    public func hiddenLoadingView(){
        for  subView in self.subviews {
            if subView.classForCoder == TKHUD.classForCoder() {
                subView.removeFromSuperview()
            }
        }
    }
    
    public func showToast(message:String,afterDelay:TimeInterval = 2.5) {
        let toastView = TKHUD(frame: self.bounds)
        toastView.addToastView(message: message)
        self.addSubview(toastView)
        if afterDelay>0 {
            DispatchQueue.main.asyncAfter(deadline: .now() + afterDelay) {
                toastView.removeFromSuperview()
            }
        }
    }
}

相关文章

  • iOS组件化及架构设计

    iOS组件化及架构设计 iOS组件化及架构设计

  • iOS 关于组件化Router设计的争辩

    iOS 关于组件化Router设计的争辩 iOS 关于组件化Router设计的争辩

  • 一种简单的 iOS 的组件化设计

    一种简单的 iOS 的组件化设计 一种简单的 iOS 的组件化设计

  • iOS组件化储备

    资料 组件化/模块化 蜂鸟商家版 iOS 组件化 / 模块化实践总结 模块化与解耦 浅析 iOS 应用组件化设计 ...

  • iOS组件化

    0.ios组件化/模块化1.iOS 组件化开发项目框架设计2.iOS 组件二进制化方案3.组件化4.Seemygo...

  • 面试3

    12、iOS组件化 iOS组件化及架构设计关于组件化网上组件化的文章很多。很多文章一提到组件化,就会说解耦,一说到...

  • iOS组件化/模块化 APP方案实践篇

    1.博客文章: [模块化与解耦](模块化与解耦 - 刘坤的技术博客) 浅析 iOS 应用组件化设计 [iOS组件化...

  • iOS组件化

    iOS组件化 iOS组件化

  • 任职要求

    1. 精通 iOS 平台的模块化设计架构,能够设计出 SDK 和 UI 组件方案,并实现定制化UI组件界面,动画;...

  • iOS组件化方案

    iOS组件化方案 iOS组件化方案

网友评论

      本文标题:iOS组件化(单页面设计)

      本文链接:https://www.haomeiwen.com/subject/bchbrdtx.html