前言
上一篇我们把记录视频播放、音频播放、读绘本的使用记录已经做好了,现在我们做下成长乐园。 成长乐园是可以上下左右滑动的,我们这里使用LTScrollView库
主控制器
看效果图,我们使用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) {
}
}