pujiaxin33 / JXSegmentedView

A powerful and easy to use segmented view (segmentedcontrol, pagingview, pagerview, pagecontrol, categoryview) (腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流APP分类切换滚动视图)
MIT License
2.68k stars 369 forks source link

JXSegmentedTitleDataSource,textWidth,itemWidth,itemWidthIncrement 生效,但是标题漏出,导致覆盖问题 #199

Open nice2m opened 2 years ago

nice2m commented 2 years ago

lib_addr: https://github.com/pujiaxin33/JXSegmentedView lib_version: 1.3.0,1.2.5 iOS 15.2 iPhone7

itemWidth,itemWidthIncrement 生效或定制化问题,UILabel标题漏出,导致覆盖

解决参考:

class MyCustomTabTitleDataSource: JXSegmentedTitleDataSource{
    open override func registerCellClass(in segmentedView: JXSegmentedView) {
        segmentedView.collectionView.register(MyCustomTabTitleCell.self, forCellWithReuseIdentifier: "cell")
    }
}

class MyCustomTabTitleCell: JXSegmentedTitleCell {

    open override func layoutSubviews() {
        super.layoutSubviews()

        guard let myItemModel = itemModel as? JXSegmentedTitleItemModel else {
            return
        }

        let labelSize = titleLabel.sizeThatFits(self.contentView.bounds.size)
        var labelBounds = CGRect(x: 0, y: 0, width: labelSize.width, height: labelSize.height)

        // 增加以下一句,可限制UILabel 漏出或撑出UICollectionViewCell 问题
              //  dataSource 中的 widthForTitleClosure 或 open func widthForTitle(_ title: String) -> CGFloat 会生效
        labelBounds.size.width = myItemModel.textWidth

        titleLabel.bounds = labelBounds
        titleLabel.center = contentView.center

        maskTitleLabel.bounds = labelBounds
        maskTitleLabel.center = contentView.center
    }
}

参考代码:

let segmentView = JXSegmentedView()
segmentView.delegate = self
let dataSource = MyCustomTabTitleDataSource()
dataSource.titles = ["很长很长的标题/很长很长的标题/很长很长的标题","不是很长的标题"]
dataSource.widthForTitleClosure = {[weak self] ( aString) -> CGFloat in
    // print("aString:\(aString)")
    return (UIScreen.main.bounds / CGFloat(2))
}
segmentView.dataSource = dataSource