使用Swift开发一个贝乐虎启蒙App - 成长乐园

529 阅读3分钟

前言

上一篇我们把记录视频播放、音频播放、读绘本的使用记录已经做好了,现在我们做下成长乐园。 成长乐园是可以上下左右滑动的,我们这里使用LTScrollView

1111111.gif

主控制器

看效果图,我们使用LTSimpleManager就可以了

  • 实例化一个LTSimpleManager
private lazy var simpleManager: LTSimpleManager = {
    let simpleManager = LTSimpleManager(frame: managerReact(), viewControllers: viewControllers, titles: titles, currentViewController: self, layout: layout)
    simpleManager.delegate = self
    simpleManager.configHeaderView { [weak self] in
        guard let `self` = self else { return nil }
        return self.headerView
    }
    return simpleManager
}()
  • frame
private func managerReact() -> CGRect {
    let statusBarH = UIApplication.shared.statusBarFrame.size.height
    let Y: CGFloat = statusBarH + 44
    let H: CGFloat = glt_iphoneX ? (view.bounds.height - Y - 34) : view.bounds.height - Y
    return CGRect(x: 0, y: Y, width: view.bounds.width, height: H)
}
  • viewControllers
private lazy var viewControllers: [UIViewController] = {
    let vc1 = GPColumnViewController()
    let vc2 = GPVideoViewController()
    let vc3 = GPBookViewController()
    let vc4 = GPAudioViewController()
    return [vc1, vc2, vc3, vc4]
}()  
  • titles
private lazy var titles: [String] = {
    ["专栏", "视频", "绘本", "音频"]
}()
  • 样式LTLayout
public class LTLayout: NSObject {
    /**
     自定义每一个item的宽,如果有值内部将不再计算每一个item的宽
     isNeedScale如果不设置为false,将来取每一个itemView的时候frame由于缩放效果会导致frame改变
     isNeedScale如果为true可以从 layout.layoutItemWidths 取值这样不会影响内部布局
     */
    @objc public lazy var layoutItemWidths: [CGFloat] = [CGFloat]()

    /** pageView背景颜色 **/
    @objc public var titleViewBgColor: UIColor? = UIColor(r: 255, g: 239, b: 213)

    /** 标题颜色,请使用RGB赋值 **/
    @objc public var titleColor: UIColor? = NORMAL_BASE_COLOR

    /** 标题选中颜色,请使用RGB赋值 **/
    @objc public lazy var titleSelectColor: UIColor? = SELECT_BASE_COLOR

    /** 标题字号 **/
    @objc public lazy var titleFont: UIFont? = UIFont.systemFont(ofSize: 16)

    /** 滑块底部线的颜色 - UIColor.blue **/
    @objc public lazy var bottomLineColor: UIColor? = UIColor.red

    /** pageView底部线的颜色 **/
    @objc public lazy var pageBottomLineColor: UIColor? = UIColor(r: 230, g: 230, b: 230)

    /** 整个滑块的高,pageTitleView的高 **/
    @objc public lazy var sliderHeight: CGFloat = 44.0

    /** 单个滑块的宽度, 一旦设置,将不再自动计算宽度,而是固定为你传递的值 **/
    @objc public lazy var sliderWidth: CGFloat = glt_sliderDefaultWidth

    /**
     * 如果刚开始的布局不希望从最左边开始, 只想平均分配在整个宽度中,设置它为true
     * 注意:此时最左边 lrMargin 以及 titleMargin 仍然有效,如果不需要可以手动设置为0
     **/
    @objc public lazy var isAverage: Bool = false

    /** 滑块底部线的高 **/
    @objc public lazy var bottomLineHeight: CGFloat = 2.0

    /** 滑块底部线圆角 **/
    @objc public lazy var bottomLineCornerRadius: CGFloat = 0.0

    /** 是否隐藏滑块、底部线**/
    @objc public lazy var isHiddenSlider: Bool = false

    /** 标题直接的间隔(标题距离下一个标题的间隔)**/
    @objc public lazy var titleMargin: CGFloat = 30.0

    /** 距离最左边和最右边的距离 **/
    @objc public lazy var lrMargin: CGFloat = 10.0

    /** 滑动过程中是否放大标题 **/
    @objc public lazy var isNeedScale: Bool = true

    /** 放大标题的倍率 **/
    @objc public lazy var scale: CGFloat = 1.2

    /** 是否开启颜色渐变 **/
    @objc public lazy var isColorAnimation: Bool = true

    /** 是否隐藏底部线 **/
    @objc public lazy var isHiddenPageBottomLine: Bool = false

    /** pageView底部线的高度 **/
    @objc public lazy var pageBottomLineHeight: CGFloat = 0.5

    /** pageView的内容ScrollView是否开启左右弹性效果 **/
    @objc public lazy var isShowBounces: Bool = false

    /** pageView的内容ScrollView是否开启左右滚动 **/
    @objc public lazy var isScrollEnabled: Bool = true

    /** pageView的内容ScrollView是否显示HorizontalScrollIndicator **/
    @objc public lazy var showsHorizontalScrollIndicator: Bool = true

    /** 是否悬停 默认为true开启悬停 此属性仅对LTSimpleManager有效 关闭时记得修改viewControll的frame**/
    @objc public lazy var isHovered: Bool = true

    /** 内部使用 - 外界不需要调用 **/
    internal lazy var isSinglePageView: Bool = false
}
private lazy var layout: LTLayout = {
    let layout = LTLayout()
    layout.isAverage = true
    layout.isNeedScale = false
    layout.sliderWidth = 28
    layout.bottomLineHeight = 4
    layout.bottomLineCornerRadius = 2
    layout.bottomLineColor = UIColor.theme
    layout.pageBottomLineColor = UIColor.line
    layout.pageBottomLineHeight = 0.5
    layout.titleSelectColor = UIColor.theme
    layout.titleViewBgColor = UIColor.white
    layout.titleColor = UIColor.titleColor
    layout.titleFont = 14.font
    return layout
}()
  • simpleManager添加到view里面
private func addSubviews() {
    automaticallyAdjustsScrollViewInsets = false
    view.addSubview(simpleManager)
    /// glt_headerHeight 可以动态改变header的高度
    simpleManager.glt_headerHeight = 200
}
  • LTSimpleScrollViewDelegate
extension GrowthParadiseViewController: LTSimpleScrollViewDelegate {
    // MARK: 滚动代理方法
    func glt_scrollViewDidScroll(_: UIScrollView) {}

    // MARK: 控制器刷新事件代理方法
    func glt_refreshScrollView(_ scrollView: UIScrollView, _ index: Int) {}
}

子控制器

这里我们以绘本为例,新建一个GPBookViewController

创建tableView

class GPBookViewController: BaseViewController {

    private var dataSource = [RecChildDataModel]()

    private lazy var tableView: UITableView = {
        let view = UITableView(frame: .zero, style: .plain)
        view.separatorStyle = .none
        view.rowHeight = 110
        view.delegate = self
        view.dataSource = self
        view.register(cellWithClass: GPBookCell.self)
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        addSubviews()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        getData()
    }

    private func addSubviews() {
        disablesAdjustScrollViewInsets(tableView)

        view.addSubview(tableView)
        /// 这个别忘记设置
        glt_scrollView = tableView

        tableView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(44)
            make.left.right.equalToSuperview()
            make.bottom.equalToSuperview().offset(-49)
        }
    }
}

extension GPBookViewController {
    /// 获取绘本数据
    private func getData() {
        dataSource = BookCacheManager.share.getAllBooks()
        tableView.reloadData()
    }
}

extension GPBookViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withClass: GPBookCell.self)
        cell.update(dataSource[indexPath.row])
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }
}