Charts: مُنسق قيمة Y المخصص

تم إنشاؤها على ١٢ أبريل ٢٠١٦  ·  11تعليقات  ·  مصدر: danielgindi/Charts

بادئ ذي بدء ، مكتبة IOS هذه رائعة! شكرا.

يجب أن أعرض قيم Y في مخطط شريطي بتنسيق الوقت (mn: ss)

لقد رأيت في وثائق IOS أن فئة تسمى "ChartDefaultXAxisValueFormatter" ، لكن لا يمكنني العثور على طريقة لاستخدامها.

هل حقق أي شخص مثل هذا الشيء؟

الكسيس

feature

التعليق الأكثر فائدة

لقد حققت ذلك من خلال وراثة 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 ، وقم بتعيين كائن للرسم البياني leftAxis

    // Number formatting of YAxis
    chartView.leftAxis.valueFormatter = YAxisValueFormatter()

ال 11 كومينتر

هل نظرت إلى مثال وحدة التحكم في عرض المخطط الشريطي المكدس؟ أتخيل أنه مشابه حيث تمرر منسق؟

        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.

أحاول استخدام ChartDefaultXAxisValueFormatter كما هو الحال في الملفات السريعة ، لكن لا يمكنني إدارة تنفيذه.

ما نحتاجه هو عرض المحور الأيسر (ص) كوقت على سبيل المثال = 1:02:58

الكسيس

مرحبًا ، أفترض أن ما تريده هو تمرير NSDateFormatter؟

أرى هذا في التعريف:
القيمة var العامةالمنسق: ChartXAxisValueFormatter؟

لذلك يجب أن يكون أحد فصولك ينفذ هذا البروتوكول

<strong i="9">@interface</strong> MyChartViewController: < ChartXAxisValueFormatter>

أو

<strong i="13">@interface</strong> MyCustomFormatter: NSObject < ChartXAxisValueFormatter>

أو ما يعادله بسرعة.

ولكن يبدو أنك تريد تنسيق yVals ، مما يعني أنه لا يمكنك الوصول إلا إلى NSNumberFormatter. حق؟

نحن نجري بالفعل مناقشة حول قضية مشابهة لهذا في # 742. ومع ذلك ، يبدو أن موقف danielgindi حاليًا هو أن هذا غير صحيح.

لذلك أعتقد أن لديك 3 خيارات.

  • إذا كان ChartXAxisValueFormatter كافياً ، فقم بتنفيذ البروتوكول. يمكنني مساعدتك في ذلك.
  • إذا لم يكن الأمر كذلك ، فإن أبسط ما يمكنك فعله هو كتابة فئة فرعية من NSNumberFormatter تتجاوز stringFromNumber وتمرير هذه القيمة إلى NSDateFormatter ، أو إجراء تنسيق مخصص خاص بك.
  • إذا كنت تشعر بالراحة في تعديل المكتبة ، يمكنك دمج طلب السحب في # 742 بالشوكة الخاصة بك وتمرير NSDateFormatter ، والذي أعتقد أنه سيكون قادرًا على تنسيق الوقت كما يحلو لك. أو يمكنك إضافة تنسيق ChartYAxisValueFormatter على غرار ChartXAxisValueFormatter.

لاحظ أنني جديد إلى حد ما في هذه المكتبة الرائعة التي تحتوي على الكثير من الخيارات الرائعة التي لست على دراية بها ، لذلك قد أفتقد شيئًا واضحًا.

نقدر اقتراحاتك. نحتاج إلى التفكير مليًا إذا أردنا نقل منسق المحور إلى المُنسِّقات. بالنظر إلى أن جميع البيانات عبارة عن أرقام بشكل طبيعي ، نعتقد أن منسق الأرقام هو المنسق الذي يجب استخدامه. في حالة رغبتك في عرض سلاسل مختلفة من القيمة ، يمكنك تخصيص السلاسل الخاصة بك. لكن مصدر المنسق هو رقم بالتأكيد.

لقد استخدمت طريقة التجاوز. هذا يعمل كالسحر!
شكرا يا رفاق ، أنتم الأفضل :)

NSNumberFormatter أصح من NSFormatter ببساطة لأن القيمة التي يتم تمريرها هي _ دائمًا_ رقم. لا تكسب أي شيء باستخدام NSFormatter وجه التحديد. حقيقة أنك تريد ناتجًا ليس رقمًا ، لا يغير حقيقة أن الإدخال عبارة عن رقم ، وتريد تنسيق هذا الرقم بطريقة خاصة جدًا.

ومع ذلك ، سنمضي قدمًا في وجود واجهتنا الخاصة التي تمرر مزيدًا من المعلومات جنبًا إلى جنب مع القيمة (نهج ChartYAxisValueFormatter ).

بعد قولي هذا - يجب أن تظل هذه المشكلة مفتوحة حتى ننفذ البروتوكول لمنسق قيمة المحور Y.

تم التنفيذ في الرسوم البيانية 3.0 (فرع الإصدار 3)

لقد حققت ذلك من خلال وراثة 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 ، وقم بتعيين كائن للرسم البياني leftAxis

    // Number formatting of YAxis
    chartView.leftAxis.valueFormatter = YAxisValueFormatter()

عندما أرث IAxisValueFormatter كما هو مذكور أعلاه ، أحصل على خطأ: "لا يوجد نوع أو بروتوكول يسمى 'IChartAxisValueFormatter'" في ملف ProjectName-Swift.h الخاص بي.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

kwstasna picture kwstasna  ·  3تعليقات

BrandonShega picture BrandonShega  ·  4تعليقات

coop44483 picture coop44483  ·  3تعليقات

newbiebie picture newbiebie  ·  3تعليقات

valeIT picture valeIT  ·  3تعليقات