pujiaxin33 / JXSegmentedView

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

JXSegmentedTitleImageDataSource (图片在上或者在下的时候宽度计算) #219

Closed lianshuaishuai closed 1 week ago

lianshuaishuai commented 1 year ago
open override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat {
    var width = super.preferredSegmentedView(segmentedView, widthForItemAt: index)

    if itemWidth == JXSegmentedViewAutomaticDimension {
        switch titleImageType {
        case .leftImage, .rightImage:
            width += titleImageSpacing + imageSize.width
        case .topImage, .bottomImage:
            width = max(itemWidth, imageSize.width)
        case .onlyImage:
            width = imageSize.width
        case .onlyTitle:
            break
        }
    }
    return width
}

上面应该取width 不应该用itemWidth

LemonChao commented 1 year ago

我也遇到了同样的问题,新版本会修复吗 @pujiaxin33

lianshuaishuai commented 1 year ago

我也遇到了同样的问题,新版本会修复吗 @pujiaxin33

我尝试了继承 JXSegmentedTitleImageDataSource 重写 override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat { var width = itemWidthIncrement if itemWidth == JXSegmentedViewAutomaticDimension { width += (dataSource[index] as! JXSegmentedTitleItemModel).textWidth }else { width += itemWidth }

    if itemWidth == JXSegmentedViewAutomaticDimension {
        switch titleImageType {
        case .leftImage, .rightImage:
            width += titleImageSpacing + imageSize.width
        case .topImage, .bottomImage:
            width = max(width, imageSize.width)
        case .onlyImage:
            width = imageSize.width
        case .onlyTitle:
            break
        }
    }
    return width
}

但是 func segmentedView(_ segmentedView: JXSegmentedView, widthForItemContentAt index: Int) -> CGFloat 无法重写 (使用pod管理的 此方法使用的public) 查看了一下 如果不是一些特定的 例如缩放 获取模型中的宽度等 这个方法不重写 好像也不影响 如果有问题 请指出

LemonChao commented 1 year ago

我是这样重写的,宽度就正常了

   override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat {
        var width = (dataSource[index] as! JXSegmentedTitleImageItemModel).textWidth
        if itemWidth == JXSegmentedViewAutomaticDimension {
            switch titleImageType {
            case .leftImage, .rightImage:
                width += titleImageSpacing + imageSize.width
            case .topImage, .bottomImage:
                width = max(width, imageSize.width)
            case .onlyImage:
                width = imageSize.width
            case .onlyTitle:
                break
            }
        }
        return width
    }
pujiaxin33 commented 1 week ago

我是这样重写的,宽度就正常了

   override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat {
        var width = (dataSource[index] as! JXSegmentedTitleImageItemModel).textWidth
        if itemWidth == JXSegmentedViewAutomaticDimension {
            switch titleImageType {
            case .leftImage, .rightImage:
                width += titleImageSpacing + imageSize.width
            case .topImage, .bottomImage:
                width = max(width, imageSize.width)
            case .onlyImage:
                width = imageSize.width
            case .onlyTitle:
                break
            }
        }
        return width
    }

已参考,修复。