簡體   English   中英

帶有ios-charts庫的Swift,如何在BarChart中設置條形上方的圖標大小?

[英]Swift with ios-charts library,How to set the size of icons above bars in BarChart?

使用圖表庫,我有一個視圖,顯示圖像或名稱的首字母,直到插入數據。 我想將此視圖用作條形圖頂部的圖像。 由於它不是一個時代,我必須通過自定義方法將其轉換為 UIImage,因為 Icon 不接受 Views bu only images。

如果我嘗試更改幀值,我無法理解我想要的原因,圓形視圖會小一點,在這種情況下,條形圖的大小相同,而不是“偏心”。

左:起始情況(圓圈比條寬略大) 右:將IE寬度和高度改為52后

在此處輸入圖片說明

我的自定義視圖有這個代碼,我認為在這里可能有用(無法更改給定的內在內容大小):

public var model: BrandViewModel! { didSet { self.updateOutlets() } }
open override var intrinsicContentSize: CGSize { CGSize(width: 72, height: 72) }


open override func configure() {
    
    super.configure()
    
    self.backgroundColor = .white
    self.layer.cornerRadius = self.intrinsicContentSize.width / 2
    self.imageView.layer.cornerRadius = self.imageView.bounds.width / 2
    self.initialsContainer.layer.cornerRadius = self.imageView.layer.cornerRadius
    
    self.setupShadow()
}

我的圖表類:

public struct BarChartValue {
    public var value: Double?
    public var name: String?
    public var color: UIColor?
    
    public init(value: Double?, name: String?, color: UIColor?) {
        self.value = value
        self.name = name
        self.color = color
    }
}

public class CorporateBarChartView: BarChartView {
    
    public override func awakeFromNib() {
        super.awakeFromNib()
        self.setup()
    }
    
    public var values: [BarChartValue]? {
        willSet {
            self.setDataCount(withValues: newValue)
        }
    }
    
    private func setup() {
        self.chartDescription.enabled = false
        self.highlightPerTapEnabled = false
        self.legend.enabled = false
        self.drawBarShadowEnabled = false
        self.drawValueAboveBarEnabled = false
        self.leftAxis.enabled = false
        self.rightAxis.enabled = false
        self.xAxis.enabled = false
        self.pinchZoomEnabled = false
        self.doubleTapToZoomEnabled = false
        self.leftAxis.axisMinimum = 0
        self.isUserInteractionEnabled = false
    }
    
    func setDataCount(withValues values: [BarChartValue]?) {
        guard let values = values else { return }
        let silverPlaceholder = UIColor.gray.withAlphaComponent(0.2)
        
        let dataEntries = values.enumerated().map({ (index, value) -> BarChartDataEntry in
            let brandView = BrandView()
            brandView.model = BrandViewModel(name: value.name, image: nil)
            let view = UIView(frame: CGRect(x: 0, y: 0, width: 72, height: 72))
            view.addSubview(brandView)
            view.backgroundColor = .red//.clear
            brandView.backgroundColor = .green//.clear
            let image = self.image(with: view)
            return BarChartDataEntry(x: Double(index), y: value.value ?? 0, icon: image)
        })
        var set: BarChartDataSet! = nil
        set = BarChartDataSet(entries: dataEntries)
        set.colors = values.map({ (model) -> NSUIColor in
            return (model.color ?? silverPlaceholder)
        })
        set.drawValuesEnabled = false
        
        let data = BarChartData(dataSet: set)
        data.barWidth = 0.3
        self.data = data
    }
    
    func image(with view: UIView) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
        defer { UIGraphicsEndImageContext() }
        if let context = UIGraphicsGetCurrentContext() {
            view.layer.render(in: context)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            return image
        }
        return nil
    }
}
  1. 為什么您必須將您的brandView view包裝到另一個view 如果這樣做,則必須確保其布局正確或設置了正確的框架。 我還建議重用視圖的一個實例,這意味着我會在 dataEntries 之前創建它一次,並使用新數據重新配置它以生成新圖像。
  2. 我想您必須將圖像大小調整為所需的大小,以便圖表可以正確繪制。 為此,您可以使用這些擴展:

extension UIImage {

    func scaled(toWidth width: CGFloat) -> UIImage? {

        guard width > 0.0, self.size.width > 0.0 else {
            return nil
        }

        return self.redrawnImage(with: self.size.scaled(toWidth: width))
    }

    func scaled(toHeight height: CGFloat) -> UIImage? {

        guard height > 0.0, self.size.height > 0.0 else {
            return nil
        }

        return self.redrawnImage(with: self.size.scaled(toHeight: height))
    }

    private func redrawnImage(with size: CGSize) -> UIImage {

        UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: .init(origin: .zero, size: size))
        }
    }
}

extension CGSize {

    func scaled(toWidth width: CGFloat) -> CGSize {
        CGSize(width: width, height: (self.height / self.width) * width)
    }

    func scaled(toHeight height: CGFloat) -> CGSize {
        CGSize(width: (self.width / self.height) * height, height: height)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM