рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрдИрдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдорд╛рд▓ рдХреА рд╣реИ! рдзрдиреНрдпрд╡рд╛рджред
рдореБрдЭреЗ рд╕рдордп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдореЗрдВ рд╡рд╛рдИ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдПрдордПрди: рдПрд╕рдПрд╕)
рдореИрдВрдиреЗ рдЖрдИрдУрдПрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрд░ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ "рдЪрд╛рд░реНрдЯрдбрд┐рдлреЙрд▓реНрдЯрдПрдХреНрд╕рдПрдХреНрд╕рд┐рд╕рд╡реИрд▓реНрдпреВрдлреЙрд░реНрдореЗрдЯрд░" рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдРрд╕рд╛ рдореБрдХрд╛рдо рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ?
рдПрд▓реЗрдХреНрд╕рд┐рд╕
рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реНрдЯреИрдХреНрдб рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рдлреЙрд░реНрдореЗрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ?
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 1;
formatter.negativeSuffix = @" $";
formatter.positiveSuffix = @" $";
BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets];
[data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]];
[data setValueFormatter:formatter];
_chartView.data = data;
@dxclancy рдиреЗ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдЕрднреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рджрд┐рдирд╛рдВрдХ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЛ рдкрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдирдорд╕реНрддреЗ,
рдЖрдкрдХрд╛ рдЙрддреНрддрд░ рдзрдиреНрдпрд╡рд╛рджред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, leftAxis.valueformatter рдХреЗрд╡рд▓ NSNumberFormatter рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рддреЗрдЬреА рд╕реЗ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЪрд╛рд░реНрдЯрдбрд┐рдлреЙрд▓реНрдЯрдПрдХреНрд╕рдПрдХреНрд╕рд┐рд╕рд╡реИрд▓реНрдпреВрдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдПрдВ (рд╡рд╛рдИ) рдЕрдХреНрд╖ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ = 1:02:58
рдПрд▓реЗрдХреНрд╕рд┐рд╕
рд╣рд╛рдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ NSDateFormatter рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ?
рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ:
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ var valueFormatter: ChartXAxisValueFormatter?
рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЙрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
<strong i="9">@interface</strong> MyChartViewController: < ChartXAxisValueFormatter>
рдпрд╛
<strong i="13">@interface</strong> MyCustomFormatter: NSObject < ChartXAxisValueFormatter>
рдпрд╛ рддреЗрдЬ рд╕рдордХрдХреНрд╖ред
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк yVals рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ NSNumberFormatter рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рд╕рд╣реА?
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ #742 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, @danielgindi рдХреА рд╕реНрдерд┐рддрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИред
рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЗрд╣рддрд░реАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдореИрдВ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред
рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЕрдЧрд░ рд╣рдо рдПрдХреНрд╕рд┐рд╕ рдлреЙрд░реНрдореЗрдЯрд░ рдХреЛ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВ, рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдореЗрдЯрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдорд╛рди рд╕реЗ рднрд┐рдиреНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХрд╛ рд╕реНрд░реЛрдд рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдореИрдВрдиреЗ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдиреЗ рдПрдХ рдЬрд╛рджреВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛!
рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ, рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ :)
NSNumberFormatter
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИ NSFormatter
рдмрд╕ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдПрдХ рдирдВрдмрд░ _always_ рд╣реИ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдХреА рд╡рдЬрд╣ рд╕реЗред рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ NSFormatter
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рднреА рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЙрд╕ рдирдВрдмрд░ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдЬреЛ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ( ChartYAxisValueFormatter
рджреГрд╖реНрдЯрд┐рдХреЛрдг)ред
рдРрд╕рд╛ рдХрд╣рдХрд░ - рдпрд╣ рдореБрджреНрджрд╛ рддрдм рддрдХ рдЦреБрд▓рд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рд╣рдо рд╡рд╛рдИ рдЕрдХреНрд╖ рдорд╛рди рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗред
рдЪрд╛рд░реНрдЯ 3.0 рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд (v3 рд╢рд╛рдЦрд╛)
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ IAxisValueFormatter
ред
import Foundation
import Charts
class YAxisValueFormatter: NSObject, IAxisValueFormatter {
let numFormatter: NumberFormatter
override init() {
numFormatter = NumberFormatter()
numFormatter.minimumFractionDigits = 1
numFormatter.maximumFractionDigits = 1
// if number is less than 1 add 0 before decimal
numFormatter.minimumIntegerDigits = 1 // how many digits do want before decimal
numFormatter.paddingPosition = .beforePrefix
numFormatter.paddingCharacter = "0"
}
/// Called when a value from an axis is formatted before being drawn.
///
/// For performance reasons, avoid excessive calculations and memory allocations inside this method.
///
/// - returns: The customized label that is drawn on the axis.
/// - parameter value: the value that is currently being drawn
/// - parameter axis: the axis that the value belongs to
///
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return numFormatter.string(from: NSNumber(floatLiteral: value))!
}
}
YAxisValueFormatterclass рдмрдирд╛рдПрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧреНрд░рд╛рдлрд╝ рд▓реЗрдлреНрдЯрдПрдХреНрд╕рд┐рд╕ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ
// Number formatting of YAxis
chartView.leftAxis.valueFormatter = YAxisValueFormatter()
рдЬрдм рдореИрдВ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ IAxisValueFormatter рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: рдореЗрд░реА ProjectName-Swift.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "IChartAxisValueFormatter' рдирд╛рдо рдХрд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╣реАрдВ рд╣реИ"ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛
IAxisValueFormatter
редYAxisValueFormatterclass рдмрдирд╛рдПрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧреНрд░рд╛рдлрд╝ рд▓реЗрдлреНрдЯрдПрдХреНрд╕рд┐рд╕ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ