2017-01-18 3 views
2

라이브러리 차트 (Daniel Gindi)를 버전 2 (Swift 2.3)에서 3 (Swift 3)으로 마이그레이션하는 데 어려움이 있습니다.ios 차트 3.0 - x 레이블 (날짜)을 플롯으로 정렬

기본적으로 x 레이블 (날짜)을 해당 플롯과 올바르게 정렬 할 수 없습니다.

내가 버전 2 년 전에 한 것입니다 : 버전 2에서 나는 일 7, 8, 10, 11 그래서, 중간에 하루에 누락 되었으나을 값을했다

라벨이 플롯으로 올바르게 정렬되었습니다. 그것은 TimeInterval이의 버전 3에서

는, x 축에서 "라벨은"지금 (더블로 대체 날짜에 대해되었습니다 Charts 2


그리고 여기에 내가 버전 3에있는 것입니다 1970 년 이후) 포맷터를 통해 포맷되었습니다. 차트가 올바르게 9 번째 값을 추정하기 때문에 그래프가 더 "정확한"것이므로 그래프를 해당 플롯 아래에 배치하는 방법을 찾을 수 없습니다. ,

import Foundation 
import Charts 

class ChartXAxisFormatter: NSObject { 
    var dateFormatter: DateFormatter? 
} 

extension ChartXAxisFormatter: IAxisValueFormatter { 

    func stringForValue(_ value: Double, axis: AxisBase?) -> String { 
     if let dateFormatter = dateFormatter { 

      let date = Date(timeIntervalSince1970: value) 
      return dateFormatter.string(from: date) 
     } 

     return "" 
    } 

} 

그래서, 여기에 값이 올바른지, 형식이 정확한지 :

여기
let chartView = LineChartView() 
... 
let xAxis = chartView.xAxis 
xAxis.labelPosition = .bottom 
xAxis.labelCount = entries.count 
xAxis.drawLabelsEnabled = true 
xAxis.drawLimitLinesBehindDataEnabled = true 
xAxis.avoidFirstLastClippingEnabled = true 

// Set the x values date formatter 
let xValuesNumberFormatter = ChartXAxisFormatter() 
xValuesNumberFormatter.dateFormatter = dayNumberAndShortNameFormatter // e.g. "wed 26" 
xAxis.valueFormatter = xValuesNumberFormatter 

내가 만든 ChartXAxisFormatter 클래스입니다 : Charts 3

이는이 X 축에 대한 내 코드입니다 차트의 모양은 정확하지만 레이블과 해당 플롯의 정렬이 좋지 않습니다. 도움 주셔서 감사합니다.

+0

차트 3.0.0과 차트 3.0.1을 사용하여 재현 할 수있었습니다. 동시에, 나는 이러한 문제로 고생하지 않는 별도의 프로젝트에서 Chart 3.0.0을 사용하는 코드를 가지고있다. 차트 설정의 일부 조합이이 버그를 나타낼 수 있습니까? – Alex

+0

Charts Github 레포에 대한 응답이있었습니다. 차트가 보간을 사용하여 표시 할 레이블을 결정하기 때문에 분명히 x 축에 ** 시간 간격 **을 사용할 때 발생합니다. –

답변

7

확인 하시겠습니까?

참조 시간 간격 (x 축에 대해 "0")을 정의해야합니다. 그런 다음 각 x 값에 대한 추가 시간 간격을 계산하십시오.

ChartXAxisFormatter가된다 : 내 데이터 항목을 만들 때 다음

import Foundation 
import Charts 

class ChartXAxisFormatter: NSObject { 
    fileprivate var dateFormatter: DateFormatter? 
    fileprivate var referenceTimeInterval: TimeInterval? 

    convenience init(referenceTimeInterval: TimeInterval, dateFormatter: DateFormatter) { 
     self.init() 
     self.referenceTimeInterval = referenceTimeInterval 
     self.dateFormatter = dateFormatter 
    } 
} 


extension ChartXAxisFormatter: IAxisValueFormatter { 

    func stringForValue(_ value: Double, axis: AxisBase?) -> String { 
     guard let dateFormatter = dateFormatter, 
     let referenceTimeInterval = referenceTimeInterval 
     else { 
      return "" 
     } 

     let date = Date(timeIntervalSince1970: value * 3600 * 24 + referenceTimeInterval) 
     return dateFormatter.string(from: date) 
    } 

} 

을 그리고, 그것은과 같이 작동합니다

이 결과는 훨씬 좋네요
// (objects is defined as an array of struct with date and value) 

// Define the reference time interval 
var referenceTimeInterval: TimeInterval = 0 
if let minTimeInterval = (objects.map { $0.date.timeIntervalSince1970 }).min() { 
     referenceTimeInterval = minTimeInterval 
    } 


    // Define chart xValues formatter 
    let formatter = DateFormatter() 
    formatter.dateStyle = .short 
    formatter.timeStyle = .none 
    formatter.locale = Locale.current 

    let xValuesNumberFormatter = ChartXAxisFormatter(referenceTimeInterval: referenceTimeInterval, dateFormatter: xValuesFormatter) 



    // Define chart entries 
    var entries = [ChartDataEntry]() 
    for object in objects { 
     let timeInterval = object.date.timeIntervalSince1970 
     let xValue = (timeInterval - referenceTimeInterval)/(3600 * 24) 

     let yValue = object.value 
     let entry = ChartDataEntry(x: xValue, y: yValue) 
     entries.append(entry) 
    } 

// Pass these entries and the formatter to the Chart ... 

이다 (나는 방법에 의해 입방 제거) : enter image description here

+0

참조 용 데모 코드를 공유하십시오. – TKutal

+0

나는 그것이 내가 한 것이라고 생각한다. –

+0

xValuesFormatter 란 무엇인가? –