更改视图会导致屏幕上显示内容

时间:2018-02-25 14:07:59

标签: ios swift bar-chart viewcontroller

现在,我有一个自定义图表类,可以创建条形图并显示它们。但是它们仅在我出现在视图控制器上两次后出现。例如。在这里,我在一个具有图形的视图控制器上,但它以不完整的方式显示。

enter image description here

然后在这里,我在同一个视图控制器,但与图形如何看起来像。正如您所看到的,条形图已经变长,并且出现了虚线。

enter image description here

为实现这一目标,我所做的只是点击底部的其中一个标签,然后点击报告标签,然后更改了视图。我真的不知道为什么会这样,现在已经试图解决这个问题2天了。如果有人可以帮助我,那就太好了。以下是显示图形的示例viewcontroller的代码。

override func viewDidLoad() {
    self.tabBarController?.tabBar.barTintColor = UIColor(red:0.18, green:0.21, blue:0.25, alpha:1.0)
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
override func viewWillAppear(_ animated: Bool) {
    self.tabBarController?.tabBar.barTintColor = UIColor(red:0.18, green:0.21, blue:0.25, alpha:1.0)
    tupleArray.removeAll()
    newTuple.removeAll()
    filteredCategories.removeAll()
    categories.removeAll()
    self.categories = CoreDataHelper.retrieveCategories()
    tableView.tableFooterView = UIView(frame: .zero)
    tableView.tableFooterView?.isHidden = true
    tableView.backgroundColor = UIColor.clear
    tableView.layoutMargins = UIEdgeInsets.zero
    tableView.separatorInset = UIEdgeInsets.zero
    tableView.separatorStyle = UITableViewCellSeparatorStyle.singleLine
    UIColor(red:0.40, green:0.43, blue:0.48, alpha:1.0)
    currentYear1 = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
    currentYear = String(describing: Calendar.current.component(.year, from: currentYear1))

    yearLabel.text = "\(currentYear)"
    if ExpensesAdditions().yearHasExpense(year: currentYear){
        noExpenseLabel.isHidden = true
    }
    else{
        tableView.isHidden = true
        barChartView.isHidden = true
        noExpenseLabel.isHidden = false
        totalSpentLabel.isHidden = true
    }
    totalSpent = ExpensesAdditions().retrieveYearlySum(year:currentYear)
    totalSpentLabel.text = "Total Spent: " + ExpensesAdditions().convertToMoney(totalSpent)
    for category in categories{
        if ExpensesAdditions().categoryinYearHasExpense(year:currentYear,category:category.title!){
            filteredCategories.append(category)
            tupleArray.append((category.title!,ExpensesAdditions().retrieveCategoryExpenseForYear(category: category.title!, year: currentYear)))
        }
        else{}
    }
    newTuple = tupleArray.sorted(by: { $0.1 > $1.1 })
    if ExpensesAdditions().yearHasExpense(year: currentYear){
        let dataEntries = generateDataEntries()
        barChartView.dataEntries = dataEntries
    }
}
override func viewDidAppear(_ animated: Bool) {


}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredCategories.count
}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "lastYearAnalysisCell") as! LastYearAnalysisViewTableViewCell
    cell.isUserInteractionEnabled = false
    let row = indexPath.row
    let percentage:Double = (newTuple[row].1/totalSpent)*100
    let percentageDisplay:Int = Int(percentage.rounded())
    cell.nameLabel.text = newTuple[row].0
    cell.amountLabel.text = "(\(percentageDisplay)"+"%)     "+String(describing: UserDefaults.standard.value(forKey: "chosenCurrencySymbol")!)+ExpensesAdditions().convertToMoney(newTuple[row].1)

    return cell
}
func generateDataEntries() -> [BarEntry] {

    let colors = [#colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1), #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1), #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1), #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1), #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1), #colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1)]
    maximum = newTuple[0].1

    var result: [BarEntry] = []
    /// ---- Complicated Divising -------//////
    var maximumString:String = ExpensesAdditions().convertToMoney(maximum)
    var maximumInt:Int = Int(maximumString.getAcronyms())!
    let endIndex = maximumString.index(maximumString.endIndex, offsetBy: -3)
    let truncated = maximumString.substring(to: endIndex)
    if maximumInt < 5{
        divisor = Double((5*(pow(10, truncated.count - 1))) as NSNumber)
    }
    else if maximumInt > 5{
        divisor = Double((pow(10, truncated.count)) as NSNumber)
    }
    for i in 0..<filteredCategories.count {
        let value = ExpensesAdditions().convertToMoney(tupleArray[i].1)
        var height:Double = Double(value)! / divisor
        result.append(BarEntry(color: colors[i % colors.count], height: height, textValue: value, title: filteredCategories[i].title!))
    }
    return result
    //// --- Complicated Divising End -------- /////
}

如果您需要更多代码,请提前告知我们并提前致谢!

以下是条形图输入代码的代码:

import UIKit

class BasicBarChart: UIView {

/// the width of each bar
let barWidth: CGFloat = 40.0

/// space between each bar
let space: CGFloat = 20.0

/// space at the bottom of the bar to show the title
private let bottomSpace: CGFloat = 40.0

/// space at the top of each bar to show the value
private let topSpace: CGFloat = 40.0

/// contain all layers of the chart
private let mainLayer: CALayer = CALayer()

/// contain mainLayer to support scrolling
private let scrollView: UIScrollView = UIScrollView()

var dataEntries: [BarEntry]? = nil {
    didSet {
        mainLayer.sublayers?.forEach({$0.removeFromSuperlayer()})

        if let dataEntries = dataEntries {
            scrollView.contentSize = CGSize(width: (barWidth + space)*CGFloat(dataEntries.count), height: self.frame.size.height)
            mainLayer.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)

            drawHorizontalLines()

            for i in 0..<dataEntries.count {
                showEntry(index: i, entry: dataEntries[i])
            }
        }
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setupView()
}

convenience init() {
    self.init(frame: CGRect.zero)
    setupView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupView()
}

private func setupView() {
    scrollView.layer.addSublayer(mainLayer)
    self.addSubview(scrollView)
}

override func layoutSubviews() {
    scrollView.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height)
}

private func showEntry(index: Int, entry: BarEntry) {
    /// Starting x postion of the bar
    let xPos: CGFloat = space + CGFloat(index) * (barWidth + space)

    /// Starting y postion of the bar
    let yPos: CGFloat = translateHeightValueToYPosition(value: Float(entry.height))

    drawBar(xPos: xPos, yPos: yPos, color: entry.color)

    /// Draw text above the bar
    drawTextValue(xPos: xPos - space/2, yPos: yPos - 30, textValue: entry.textValue, color: entry.color)

    /// Draw text below the bar
    drawTitle(xPos: xPos - space/2, yPos: mainLayer.frame.height - bottomSpace + 10, title: entry.title, color: entry.color)
}

private func drawBar(xPos: CGFloat, yPos: CGFloat, color: UIColor) {
    let barLayer = CALayer()
    barLayer.frame = CGRect(x: xPos, y: yPos, width: barWidth, height: mainLayer.frame.height - bottomSpace - yPos)
    barLayer.backgroundColor = color.cgColor
    mainLayer.addSublayer(barLayer)
}

private func drawHorizontalLines() {
    self.layer.sublayers?.forEach({
        if $0 is CAShapeLayer {
            $0.removeFromSuperlayer()
        }
    })
    let horizontalLineInfos = [["value": Float(0.0), "dashed": true], ["value": Float(0.5), "dashed": true], ["value": Float(1.0), "dashed": true]]
    for lineInfo in horizontalLineInfos {
        let xPos = CGFloat(0.0)
        let yPos = translateHeightValueToYPosition(value: (lineInfo["value"] as! Float))
        let path = UIBezierPath()
        path.move(to: CGPoint(x: xPos, y: yPos))
        path.addLine(to: CGPoint(x: scrollView.frame.size.width, y: yPos))
        let lineLayer = CAShapeLayer()
        lineLayer.path = path.cgPath
        lineLayer.lineWidth = 0.5
        if lineInfo["dashed"] as! Bool {
            lineLayer.lineDashPattern = [4, 4]
        }
        lineLayer.strokeColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1).cgColor
        self.layer.insertSublayer(lineLayer, at: 0)
    }
}

private func drawTextValue(xPos: CGFloat, yPos: CGFloat, textValue: String, color: UIColor) {
    let textLayer = CATextLayer()
    textLayer.frame = CGRect(x: xPos, y: yPos, width: barWidth+space, height: 22)
    textLayer.foregroundColor = color.cgColor
    textLayer.backgroundColor = UIColor.clear.cgColor
    textLayer.alignmentMode = kCAAlignmentCenter
    textLayer.contentsScale = UIScreen.main.scale
    textLayer.font = CTFontCreateWithName(UIFont.systemFont(ofSize: 0).fontName as CFString, 0, nil)
    textLayer.fontSize = 14
    textLayer.string = textValue
    mainLayer.addSublayer(textLayer)
}

private func drawTitle(xPos: CGFloat, yPos: CGFloat, title: String, color: UIColor) {
    let textLayer = CATextLayer()
    textLayer.frame = CGRect(x: xPos, y: yPos, width: barWidth + space, height: 22)
    textLayer.foregroundColor = color.cgColor
    textLayer.backgroundColor = UIColor.clear.cgColor
    textLayer.alignmentMode = kCAAlignmentCenter
    textLayer.contentsScale = UIScreen.main.scale
    textLayer.font = CTFontCreateWithName(UIFont.systemFont(ofSize: 0).fontName as CFString, 0, nil)
    textLayer.fontSize = 14
    textLayer.string = title
    mainLayer.addSublayer(textLayer)
}

private func translateHeightValueToYPosition(value: Float) -> CGFloat {
    let height: CGFloat = CGFloat(value) * (mainLayer.frame.height - bottomSpace - topSpace)
    return mainLayer.frame.height - bottomSpace - height
}
}

0 个答案:

没有答案