update tabs model

This commit is contained in:
Xinlei(Ryan) Pan 2020-04-27 15:22:40 -04:00
parent 320976e5ae
commit 3b23101710

View File

@ -31,6 +31,8 @@ import UIKit
var bottomLineLeftConstraint: NSLayoutConstraint?
var bottomLineWidthConstraint: NSLayoutConstraint?
private var widthLabel = Label()
//delegate
weak public var delegate: TabsDelegate?
@ -186,11 +188,14 @@ extension Tabs: UICollectionViewDelegateFlowLayout {
return CGSize(width: getLabelWidth(labelModel).width, height: cellHeight)
}
//pre calculate the width of the collection cell
//when user select tabs, it will reload related collectionview, if we use autosize, it would relayout the width, need to keep the cell width constant.
func getLabelWidth(_ labelModel: LabelModel?) -> CGSize {
guard let labelModel = labelModel else { return .zero}
let label = Label()
label.set(with: labelModel, nil, nil)
return label.intrinsicContentSize
widthLabel.set(with: labelModel, nil, nil)
let cgSize = widthLabel.intrinsicContentSize
widthLabel.reset()
return cgSize
}
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
@ -244,6 +249,10 @@ extension Tabs: UICollectionViewDelegateFlowLayout {
extension Tabs: UIScrollViewDelegate {
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
/*bottomScrollview is subview of self, it's not belongs to collectionview.
When collectionview is scrolling, bottomScrollView will stay without moving
Adding collectionview's offset to bottomScrollView, will make the bottomScrollview looks like scrolling with the selected tab item.
*/
guard let offsetX = collectionView?.contentOffset.x else { return }
bottomScrollView.setContentOffset(CGPoint(x: offsetX, y: bottomScrollView.contentOffset.y), animated: false)
}
@ -272,46 +281,14 @@ extension Tabs {
animationBlock()
}
}
public func progress(fromIndex: Int, toIndex: Int, progressPercentage percent: CGFloat) {
guard let _ = collectionView else { return }
MVMCoreDispatchUtility.performBlock(onMainThread: {
self.setBottomLine(fromIndex: IndexPath(row: fromIndex, section: 0), toIndex: IndexPath(row: toIndex, section: 0), percent: percent)
})
}
func setBottomLine(fromIndex: IndexPath, toIndex: IndexPath, percent: CGFloat) {
guard let fromCell = collectionView?.cellForItem(at: fromIndex) as? TabItemCell, let toCell = collectionView?.cellForItem(at: toIndex) as? TabItemCell else {
return
}
let fromWidth = getLabelWidth(fromCell.labelModel).width
let toWidth = getLabelWidth(toCell.labelModel).width
let finalWidth = (toWidth - fromWidth) * percent + fromWidth
bottomLineWidthConstraint?.constant = finalWidth
let xDifference = toCell.frame.origin.x - fromCell.frame.origin.x
let finalX = xDifference * percent + fromCell.frame.origin.x
bottomLineLeftConstraint?.constant = finalX
bottomContentView.layoutIfNeeded()
}
}
@objcMembers public class TabItemCell: UICollectionViewCell {
@objcMembers public class TabItemCell: CollectionViewCell {
public let label = Label()
public var labelModel: LabelModel?
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
func setupView() {
public override func setupView() {
super.setupView()
contentView.addSubview(label)
NSLayoutConstraint.constraintPinSubview(label, pinTop: false, pinBottom: false, pinLeft: true, pinRight: true)
label.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true