You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

122 lines
4.1 KiB

//
// DateSegmentView.swift
// HPlusFit
//
// Created by lemo. on 2019/9/17.
// Copyright © 2019 lemo. All rights reserved.
//
import UIKit
import RxGesture
typealias SegmentSelectedClosure = (Int) -> Void
class DateSegmentView: UIView {
let disposeBag = DisposeBag()
var selectedClosure: SegmentSelectedClosure?
private var lastTimeBtn: UIButton?
//
var selectIndex :Int?{
willSet{
let width = self.frame.size.width / CGFloat.init((self.titles?.count)!)
UIView.animate(withDuration: 0.3) {
self.bgView.left = ((newValue)?.int2Float)! * width
self.topLabelView.left = -(((newValue)?.int2Float)!) * width
self.bgView.layoutIfNeeded()
}
}
}
var titles: Array<String>? {
didSet {
setTitles()
}
}
lazy var bgView: UIView = {
let bg = UIView(frame: CGRect(x: 0, y: 0, width: bounds.width / 3.0, height: bounds.height))
bg.gradient(colors: [kHexColor(0x59AAFF), kHexColor(0x2B75FF)], startPoint: CGPoint(x: 0, y: 0.5), endPoint: CGPoint(x: 1, y: 0.5), locations: [0, 1])
return bg
}()
let topLabelView = UIView.init().then {
$0.backgroundColor = .clear
}
override init(frame: CGRect) {
super.init(frame: frame)
layer.cornerRadius = 3
layer.borderWidth = 0.5
layer.borderColor = kHexColor(0xDEDEDE).cgColor
layer.masksToBounds = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension DateSegmentView {
///
func setTitles() {
let width = self.frame.size.width / CGFloat.init((titles?.count)!)
let height = self.frame.size.height
for i in (titles?.indices)! {
let titleBtn = UIButton()
titleBtn.tag = 1000 + i;
titleBtn.setTitle(titles?[i], for: .normal)
titleBtn.setTitleColor(kHexColor(0x666666), for: .normal)
titleBtn.setTitleColor(kHexColor(0xffffff), for: .selected)
titleBtn.titleLabel?.font = SystemMediumFont(14)
if i == 0 {
titleBtn.isSelected = true
titleBtn.titleLabel?.font = SystemMediumFont(16)
lastTimeBtn = titleBtn
}
titleBtn.frame = CGRect.init(x: width*CGFloat.init(i), y: 0, width: width, height: height)
titleBtn.rx.tapGesture()
.when(UIGestureRecognizer.State.recognized)
.subscribe(onNext: { [weak self] sender in
guard let `self` = self else { return }
self.selectedLabel(sender: sender)
})
.disposed(by: disposeBag)
self.addSubview(titleBtn)
}
self.insertSubview(bgView, at: 0)
topLabelView.frame = self.bounds
bgView.addSubview(topLabelView)
}
func selectedLabel(sender: UITapGestureRecognizer) {
let width = self.frame.size.width / CGFloat.init((self.titles?.count)!)
UIView.animate(withDuration: 0.3, animations: {
self.bgView.left = ((sender.view?.tag)! - 1000).int2Float * width
self.topLabelView.left = -((sender.view?.tag)! - 1000).int2Float * width
self.bgView.layoutIfNeeded()
}) { [weak self] _ in
//
if let lastTimeBtn = self?.lastTimeBtn {
lastTimeBtn.isSelected = !lastTimeBtn.isSelected
lastTimeBtn.titleLabel?.font = SystemMediumFont(14)
}
if let titleBtn = sender.view as? UIButton {
titleBtn.isSelected = !titleBtn.isSelected
titleBtn.titleLabel?.font = SystemMediumFont(16)
self?.lastTimeBtn = titleBtn
}
}
if let selected = selectedClosure {
selected((sender.view?.tag)! - 1000)
}
}
}
extension Int {
var int2Float: CGFloat {
return CGFloat.init(self)
}
}