[英]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
}
}
brandView
view
包裝到另一個view
? 如果這樣做,則必須確保其布局正確或設置了正確的框架。 我還建議重用視圖的一個實例,這意味着我會在 dataEntries 之前創建它一次,並使用新數據重新配置它以生成新圖像。
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.