objective c - कोर प्लॉट: उपयोगकर्ता द्वारा चयनित बार से पॉपओवर पेश करने के लिए कैसे करें



objective-c ios (1)

मैं क्या पूरा करना चाहूंगा

मैं बार चार्ट को आकर्षित करने के लिए कोर प्लॉट (1.1) का उपयोग कर रहा हूं और मैं उपयोगकर्ता द्वारा बार (बार-बार) चुना गया है, जो नीचे के ब्योरे के साथ अधिक जानकारी के साथ एक पॉपओवर पेश करना चाहता हूं।

कोड

मेरा कोड इस तरह दिखता है:

- (void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx {

    NSNumber *yValue = self.values[idx];
    NSLog(@"barWasSelectedAtRecordIndex x: %i, y: %@",idx,yValue);

    NSDecimal plotPoint[2];
    NSNumber *plotXvalue = [self numberForPlot:plot
                                         field:CPTScatterPlotFieldX
                                   recordIndex:idx];
    plotPoint[CPTCoordinateX] =
        CPTDecimalFromFloat(plotXvalue.floatValue);

    NSNumber *plotYvalue = [self numberForPlot:plot
                                         field:CPTScatterPlotFieldY
                                   recordIndex:idx];

    plotPoint[CPTCoordinateY] =
        CPTDecimalFromFloat(plotYvalue.floatValue); 

    CPTXYPlotSpace *plotSpace =
        (CPTXYPlotSpace *)graph.defaultPlotSpace;
    CGPoint dataPoint =
        [plotSpace plotAreaViewPointForPlotPoint:plotPoint];
    NSLog(@"datapoint (CGPoint) coordinates tapped: %@",
          NSStringFromCGPoint(dataPoint));

    GrowthChartInfoTableViewController *infoViewController =
        [self.storyboard instantiateViewControllerWithIdentifier:
         @"GrowthChartInfo"];

    self.popover = [[UIPopoverController alloc]
                    initWithContentViewController:infoViewController];
    self.popover.popoverContentSize = CGSizeMake(320, 300);
    self.popover.delegate = self;
    CGRect popoverAnchor =
            CGRectMake(dataPoint.x + graph.paddingLeft,
                       dataPoint.y - graph.paddingTop + graph.paddingBottom,
                       (CGFloat)1.0f, (CGFloat)1.0f);

    [self.popover presentPopoverFromRect:popoverAnchor
                                  inView:self.view
                permittedArrowDirections:UIPopoverArrowDirectionAny
                                animated:YES];
}

मेरी समस्या

पॉपओवर व्यू नियंत्रक की y- स्थिति ग़लत है, यह प्रत्येक बार के लिए और पहले बार के लिए अलग है, जिसमें ऋणात्मक y- मान है, इसे बार की ऊपरी सीमा में कम सीमा के बजाय प्रस्तुत किया जाता है और बार छुपाता है । एक्स-स्थिति सही लगती है

कृपया सहायता कीजिए

मेरा कोड अपेक्षा के अनुरूप काम क्यों नहीं करता?

धन्यवाद!

संपादित करें

एरिक के उत्तर के आधार पर मैंने अपने कोड को निम्नानुसार अद्यतन किया है:

- (void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx {

    NSNumber *plotXvalue = [self numberForPlot:plot
                                         field:CPTScatterPlotFieldX
                                   recordIndex:idx];
    NSNumber *plotYvalue = [self numberForPlot:plot
                                         field:CPTScatterPlotFieldY
                                   recordIndex:idx];

    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;

    CGPoint cgPlotPoint =
        CGPointMake(plotXvalue.floatValue,
                    plotYvalue.floatValue);
    CGPoint cgPlotAreaPoint =
        [graph convertPoint:cgPlotPoint toLayer:graph.plotAreaFrame.plotArea];

    NSDecimal plotAreaPoint[2];
    plotAreaPoint[CPTCoordinateX] =
        CPTDecimalFromFloat(cgPlotAreaPoint.x);
    plotAreaPoint[CPTCoordinateY] =
        CPTDecimalFromFloat(cgPlotAreaPoint.y);

    CGPoint dataPoint = [plotSpace


           plotAreaViewPointForPlotPoint:plotAreaPoint];
        NSLog(@"datapoint (CGPoint) coordinates tapped: %@",NSStringFromCGPoint(dataPoint));

GrowthChartInfoTableViewController *infoViewController = [self.storyboard 
   instantiateViewControllerWithIdentifier:@"GrowthChartInfo"];



    self.popover = nil;
        self.popover = [[UIPopoverController alloc]


      initWithContentViewController:infoViewController];
    self.popover.popoverContentSize = CGSizeMake(250, 200);
    self.popover.delegate = self;
    CGRect popoverAnchor =
        CGRectMake(dataPoint.x + graph.paddingLeft,
                   dataPoint.y - graph.paddingTop + graph.paddingBottom,
                   (CGFloat)1.0f, (CGFloat)1.0f);

    [self.popover presentPopoverFromRect:popoverAnchor
        inView:self.view
        permittedArrowDirections:UIPopoverArrowDirectionUp
        animated:YES];
}

हालांकि, मैं जो परिणाम प्राप्त कर रहा हूं उससे पहले की तुलना में अधिक गलत हैं। मेरा मानना ​​है कि मुझे कुछ गलतफहमी होनी चाहिए। एनएसएलॉग कमांड के कुछ परिणाम यहां दिए गए हैं:

barWasSelectedAtRecordIndex x: 0, y: -0.03920931548773198848
datapoint (CGPoint) coordinates tapped: {-6388.88, -67024.8}

barWasSelectedAtRecordIndex x: 2, y: 0.174494288286651392
datapoint (CGPoint) coordinates tapped: {-6073.38, -66790}

barWasSelectedAtRecordIndex x: 2, y: 0.174494288286651392
datapoint (CGPoint) coordinates tapped: {-6073.38, -66790}

barWasSelectedAtRecordIndex x: 0, y: -0.03920931548773198848
datapoint (CGPoint) coordinates tapped: {-6388.88, -67024.8}

ऐसा लगता है कि बार से रूपांतरण देखने के निर्देशांक में समन्वय करता है मेरे कोड में पूरी तरह से गलत है

2 संपादित करें

आपके कोड नमूने के लिए फिर से धन्यवाद, एरिक!

मैंने अपने कोड को अपडेट किया है और इसे निम्न विकल्पों (y-value = 0: plotPoint[CPTCoordinateY] = CPTDecimalFromFloat(0.0f) साथ परीक्षण किया है, जिसके परिणामस्वरूप plotPoint[CPTCoordinateY] = CPTDecimalFromFloat(0.0f) लिए एक एंकर पॉइंट जिसका y- मान गलत लगता है (कृपया देखें निम्न स्क्रीनशॉट पर)। एंकर पॉइंट का y-value y-axis पर 0 की स्थिति के बराबर होना चाहिए।

तब मैंने डेटा के वर्तमान वाई-मान को लंगर बिंदु के y- मान सेट करने का प्रयास किया। ( plotPoint[CPTCoordinateY] = plotYvalue.decimalValue )। यह एक लंगर बिंदु का परिणाम है जो बार के शीर्ष के करीब होने के बजाय y- अक्ष के 0 मान के करीब है। हालांकि, y- मान हर कंपनी के लिए थोड़ा बदलता है (एक्स-वैल्यू) यह दर्शाता है कि y- मानों की शिफ्ट में कोई समस्या हो सकती है:

मैंने अतिरिक्त रूपांतरण की भी कोशिश की जो एरिक ने dataPoint = [self.view convertPoint:dataPoint fromView:graph.hostingView] सुझाव दिया, लेकिन इसने परिणामों को नहीं बदला। इसके अलावा, मैंने सफलता के बिना अंतिम वाई-मूल्यों को जोड़ने के लिए - graph.paddingTop + graph.paddingBottom प्रयास किया।

मैं किसी भी विचार की सराहना करता हूं कि मेरी त्रुटि क्या हो सकती है।

धन्यवाद!


-plotAreaViewPointForPlotPoint: विधि भूखंड क्षेत्र समन्वय प्रणाली में एक बिंदु देता है। आपको उस ग्राफ के समन्वय प्रणाली में परिवर्तित करना होगा:

[graph convertPoint:dataPoint fromLayer:graph.plotAreaFrame.plotArea];

ग्राफ़ और इसकी होस्टिंग दृश्य एक समन्वय प्रणाली का हिस्सा है। अगर self.view होस्टिंग दृश्य नहीं है, तो आपको निर्देशांक को उसके समन्वय प्रणाली में होस्टिंग दृश्य से परिवर्तित करना होगा।

एक अधिक पूर्ण कोड नमूना:

NSDecimal plotPoint[2];
NSNumber *plotXvalue = [self numberForPlot:plot
                                     field:CPTScatterPlotFieldX
                               recordIndex:idx];
plotPoint[CPTCoordinateX] = plotXvalue.decimalValue;

NSNumber *plotYvalue = [self numberForPlot:plot
                                     field:CPTScatterPlotFieldY
                               recordIndex:idx];
plotPoint[CPTCoordinateY] = plotYvalue.decimalValue; 

CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;

// convert from data coordinates to plot area coordinates
CGPoint dataPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint];

// convert from plot area coordinates to graph (and hosting view) coordinates
dataPoint = [graph convertPoint:dataPoint fromLayer:graph.plotAreaFrame.plotArea];

// convert from hosting view coordinates to self.view coordinates (if needed)
dataPoint = [self.view convertPoint:dataPoint fromView:hostingView];

NSLog(@"barWasSelectedAtRecordIndex x: %@, y: %@", plotXvalue, plotYvalue);
NSLog(@"datapoint coordinates tapped: %@", NSStringFromCGPoint(dataPoint));




uipopovercontroller