I have an issue with auto zoom during navigation. I followed the official docs but auto zoom doesn't work. Here my test code
SKSpeedInterval speed1;
speed1.minimumSpeed = 1;
speed1.maximumSpeed = 45;
SKSpeedInterval speed2;
speed2.minimumSpeed = 46;
speed2.maximumSpeed = 300;
SKZoomLevelConfiguration *level1 = [[SKZoomLevelConfiguration alloc] init];
SKZoomLevelConfiguration *level2 = [[SKZoomLevelConfiguration alloc] init];
level1.speedInterval = speed1;
level2.speedInterval = speed2;
level1.zoomLevel = kMaximumZoomLimit;
level2.zoomLevel = kMaximumZoomLimit-2;
SKNavigationSettings* navSettings = [SKNavigationSettings navigationSettings];
navSettings.navigationType = SKNavigationTypeReal;
navSettings.zoomLevelConfigurations = [NSArray arrayWithObjects:level1, level2, nil];
[level1 release];
[level2 release];
[[SKRoutingService sharedInstance] startNavigationWithSettings:navSettings];
Have you any idea about what is going wrong?
Related
I have a application, that can display charts with data using iOS Charts library v.2.3. Now I must enable the option to track touching points of data on the chart. I do some research and I know, that I must use the chartValueSelected method in class, that implements . I also declare chartView.delegate to self and connect outlet in view on the storyboard. But when I tested it, I always get a signal from the chartValueNothingSelected method, with none from chartValueSelected. It is something, that I should put in my code, that enables tracking touch on points in my application?
Edit: code
#interface ChartViewController () <ChartViewDelegate>
#end
#implementation ChartViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.chartView.delegate = self;
_chartView.dragEnabled = YES;
[_chartView setScaleEnabled:YES];
_chartView.pinchZoomEnabled = YES;
_chartView.drawGridBackgroundEnabled = NO;
// some random data generator
// x-axis limit line
ChartLimitLine *llXAxis = [[ChartLimitLine alloc] initWithLimit:10.0 label:#"Index 10"];
llXAxis.lineWidth = 4.0;
llXAxis.lineDashLengths = #[#(10.f), #(10.f), #(0.f)];
llXAxis.labelPosition = ChartLimitLabelPositionRightBottom;
llXAxis.valueFont = [UIFont systemFontOfSize:10.f];
//[_chartView.xAxis addLimitLine:llXAxis];
_chartView.xAxis.gridLineDashLengths = #[#10.0, #10.0];
_chartView.xAxis.gridLineDashPhase = 0.f;
ChartLimitLine *ll1 = [[ChartLimitLine alloc] initWithLimit:150.0 label:#"Upper Limit"];
ll1.lineWidth = 4.0;
ll1.lineDashLengths = #[#5.f, #5.f];
ll1.labelPosition = ChartLimitLabelPositionRightTop;
ll1.valueFont = [UIFont systemFontOfSize:10.0];
ChartLimitLine *ll2 = [[ChartLimitLine alloc] initWithLimit:-30.0 label:#"Lower Limit"];
ll2.lineWidth = 4.0;
ll2.lineDashLengths = #[#5.f, #5.f];
ll2.labelPosition = ChartLimitLabelPositionRightBottom;
ll2.valueFont = [UIFont systemFontOfSize:10.0];
ChartYAxis *leftAxis = _chartView.leftAxis;
[leftAxis removeAllLimitLines];
[leftAxis addLimitLine:ll1];
[leftAxis addLimitLine:ll2];
leftAxis.gridLineDashLengths = #[#5.f, #5.f];
leftAxis.drawZeroLineEnabled = NO;
leftAxis.drawLimitLinesBehindDataEnabled = YES;
_chartView.rightAxis.enabled = NO;
//[_chartView.viewPortHandler setMaximumScaleY: 2.f];
//[_chartView.viewPortHandler setMaximumScaleX: 2.f];
//_chartView.marker = marker;
_chartView.legend.form = ChartLegendFormLine;
[_chartView animateWithXAxisDuration:2.5];
NSMutableArray *xVals = [[NSMutableArray alloc] init];
for (int i = 0; i < 100; i++)
{
[xVals addObject:[#(i) stringValue]];
}
NSMutableArray *yVals = [[NSMutableArray alloc] init];
for (int i = 0; i < 100; i++)
{
double mult = (1000 + 1);
double val = (double) (arc4random_uniform(mult)) + 3;
[yVals addObject:[[ChartDataEntry alloc] initWithValue:val xIndex:i]];
}
LineChartDataSet *set1 = nil;
if (_chartView.data.dataSetCount > 0)
{
set1 = (LineChartDataSet *)_chartView.data.dataSets[0];
set1.yVals = yVals;
_chartView.data.xValsObjc = xVals;
[_chartView.data notifyDataChanged];
[_chartView notifyDataSetChanged];
}
else
{
set1 = [[LineChartDataSet alloc] initWithYVals:yVals label:#"DataSet 1"];
set1.lineDashLengths = #[#5.f, #2.5f];
set1.highlightLineDashLengths = #[#5.f, #2.5f];
[set1 setColor:UIColor.blackColor];
[set1 setCircleColor:UIColor.blackColor];
set1.lineWidth = 1.0;
set1.circleRadius = 3.0;
set1.drawCircleHoleEnabled = NO;
set1.valueFont = [UIFont systemFontOfSize:9.f];
//set1.fillAlpha = 65/255.0;
//set1.fillColor = UIColor.blackColor;
NSArray *gradientColors = #[
(id)[ChartColorTemplates colorFromString:#"#00ff0000"].CGColor,
(id)[ChartColorTemplates colorFromString:#"#ffff0000"].CGColor
];
CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);
set1.fillAlpha = 1.f;
set1.fill = [ChartFill fillWithLinearGradient:gradient angle:90.f];
set1.drawFilledEnabled = YES;
CGGradientRelease(gradient);
NSMutableArray *dataSets = [[NSMutableArray alloc] init];
[dataSets addObject:set1];
LineChartData *data = [[LineChartData alloc] initWithXVals:xVals dataSets:dataSets];
_chartView.data = data;
}
}
- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight
{
NSLog(#"chartValueSelected");
}
- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView
{
NSLog(#"chartValueNothingSelected");
}
#end
and from .h file
#import <UIKit/UIKit.h>
#import Charts;
#interface ChartViewController : UIViewController
#property(nonatomic, strong) IBOutlet LineChartView* chartView;
#property (strong, nonatomic) IBOutlet NSLayoutConstraint *chartViewHeightConstraint;
#end
For everyone, who will occurr similar problem to mine. I resolve my problem, cleaning everything, that can be left of old version 2.3 of Charts using CocoaPods tools and later add reference to new 3.0 version. For me, it enabled option to show actually clicked point.
I'm using this library to make charts. Everything works fine if there are several bars but when I only have one, it seems that the value cannot be shown. This is the chart if there is only one bar (image)
But when I put two bars the values are visible.
My code is this:
-(void)setupChart{
myQuota = [[DataManager shared] myQuota];
[self setupBarLineChartView:_chartView];
_chartView.delegate = self;
_chartView.drawBarShadowEnabled = NO;
_chartView.drawValueAboveBarEnabled = YES;
_chartView.maxVisibleValueCount = [myQuota.quota doubleValue] * 2;
ChartXAxis *xAxis = _chartView.xAxis;
xAxis.labelPosition = XAxisLabelPositionBottom;
xAxis.labelFont = [UIFont systemFontOfSize:10.f];
xAxis.drawAxisLineEnabled = YES;
xAxis.drawGridLinesEnabled = YES;
xAxis.gridLineWidth = .3;
ChartYAxis *leftAxis = _chartView.leftAxis;
leftAxis.labelFont = [UIFont systemFontOfSize:10.f];
leftAxis.drawAxisLineEnabled = YES;
leftAxis.drawGridLinesEnabled = YES;
leftAxis.drawLabelsEnabled = NO; // don't write label values
leftAxis.gridLineWidth = .3;
leftAxis.axisMinValue = 0.0; // this replaces startAtZero = YES
ChartYAxis *rightAxis = _chartView.rightAxis;
rightAxis.enabled = YES;
rightAxis.labelFont = [UIFont systemFontOfSize:10.f];
rightAxis.drawAxisLineEnabled = YES;
rightAxis.drawGridLinesEnabled = NO;
rightAxis.axisMinValue = 0.0; // this replaces startAtZero = YES
rightAxis.yOffset = 1.0;
rightAxis.axisMaxValue = [myQuota.quota doubleValue] * 2;
[rightAxis removeAllLimitLines];
ChartLimitLine *limit = [[ChartLimitLine alloc] initWithLimit:[myQuota.quota doubleValue] label:[NSString stringWithFormat:#"%d",[myQuota.quota integerValue] ]];
[rightAxis addLimitLine:limit];
rightAxis.valueFormatter = [[NSNumberFormatter alloc] init];
rightAxis.valueFormatter.minimumFractionDigits = 0;
_chartView.doubleTapToZoomEnabled = NO;
_chartView.highlightPerTapEnabled = NO;
_chartView.legend.enabled = NO;
[_chartView animateWithYAxisDuration:1.5];
[self setDataCount:(1) range: ([myQuota.quota doubleValue]*2)];
}
- (void)setDataCount:(int)count range:(double)range
{
NSMutableArray *xVals = [[NSMutableArray alloc] init];
[xVals addObject:myQuota.rowName];
[xVals addObject:myQuota.rowName];
NSMutableArray *yVals = [[NSMutableArray alloc] init];
double val = [myQuota.quotaReached doubleValue];
[yVals addObject:[[BarChartDataEntry alloc] initWithValue:([myQuota.quota doubleValue]*2) xIndex:0]];
BarChartDataSet *set1 = nil;
if (_chartView.data.dataSetCount > 0)
{
set1 = (BarChartDataSet *)_chartView.data.dataSets[0];
set1.yVals = yVals;
_chartView.data.xValsObjc = xVals;
[_chartView notifyDataSetChanged];
}
else
{
set1 = [[BarChartDataSet alloc] initWithYVals:yVals label:#""];
set1.barSpace = 0.35;
set1.colors = [NSArray arrayWithObjects:[UIColor greenColor], nil]; // set color
NSMutableArray *dataSets = [[NSMutableArray alloc] init];
[dataSets addObject:set1];
BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets];
[data setValueFont:[UIFont fontWithName:#"HelveticaNeue-Light" size:10.f]];
//_chartView.xAxis.labelPosition = Top
_chartView.data = data;
}
}
I've used the ios-charts project on github and used the HorizontalCharts example. It works good in the example but when I try to set the horizontal bar value, the bar just gets too long. Example visible here:
My code is this:
-(void)setupChart{
myQuota = [[DataManager shared] myQuota];
[self setupBarLineChartView:_chartView];
_chartView.delegate = self;
_chartView.drawBarShadowEnabled = NO;
_chartView.drawValueAboveBarEnabled = YES;
_chartView.maxVisibleValueCount = 60;
ChartXAxis *xAxis = _chartView.xAxis;
xAxis.labelPosition = XAxisLabelPositionBottom;
xAxis.labelFont = [UIFont systemFontOfSize:10.f];
xAxis.drawAxisLineEnabled = YES;
xAxis.drawGridLinesEnabled = YES;
xAxis.gridLineWidth = .3;
ChartYAxis *leftAxis = _chartView.leftAxis;
leftAxis.labelFont = [UIFont systemFontOfSize:10.f];
leftAxis.drawAxisLineEnabled = YES;
leftAxis.drawGridLinesEnabled = YES;
leftAxis.drawLabelsEnabled = NO;
leftAxis.gridLineWidth = .3;
leftAxis.axisMinValue = 0.0;
ChartYAxis *rightAxis = _chartView.rightAxis;
rightAxis.enabled = YES;
rightAxis.labelFont = [UIFont systemFontOfSize:10.f];
rightAxis.drawAxisLineEnabled = YES;
rightAxis.drawGridLinesEnabled = NO;
rightAxis.axisMinValue = 0.0;
rightAxis.yOffset = 1.0;
rightAxis.axisMaxValue = [myQuota.quota doubleValue]; // here is 10
_chartView.doubleTapToZoomEnabled = NO;
_chartView.highlightPerTapEnabled = NO;
_chartView.legend.enabled = NO;
[_chartView animateWithYAxisDuration:2.5];
[self updateChartData];
}
- (void)updateChartData
{
if (self.shouldHideData)
{
_chartView.data = nil;
return;
}
if(myQuota != nil && myQuota.quota != nil)
{
[self setDataCount:(1) range: [myQuota.quota doubleValue]];
}
}
- (void)setDataCount:(int)count range:(double)range
{
NSMutableArray *xVals = [[NSMutableArray alloc] init];
[xVals addObject:myQuota.rowName];
NSMutableArray *yVals = [[NSMutableArray alloc] init];
double val = [myQuota.quotaReached doubleValue]; // here is 2
[yVals addObject:[[BarChartDataEntry alloc] initWithValue:val xIndex:0]];
BarChartDataSet *set1 = nil;
if (_chartView.data.dataSetCount > 0)
{
set1 = (BarChartDataSet *)_chartView.data.dataSets[0];
set1.yVals = yVals;
_chartView.data.xValsObjc = xVals;
[_chartView notifyDataSetChanged];
}
else
{
set1 = [[BarChartDataSet alloc] initWithYVals:yVals label:#""];
set1.barSpace = 0.35;
set1.colors = [NSArray arrayWithObjects:[UIColor greenColor], nil];
NSMutableArray *dataSets = [[NSMutableArray alloc] init];
[dataSets addObject:set1];
BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets];
[data setValueFont:[UIFont fontWithName:#"HelveticaNeue-Light" size:10.f]];
_chartView.data = data;
}
}
Why is the bar so long?
Okay, since nobody offered an answer I tried a HACK. I've added an invisible bar/row for which I set the value to the maximum of the bar chart. This way the axis shows the maximum even though the bar is invisible.
I welcome anybody who knows a better way but until then I'll do it like this:
- (void)setDataCount:(int)count range:(double)range{
MY_MAX_VALUE = 10; // put HERE your MAX value for the axis
NSMutableArray *xVals = [[NSMutableArray alloc] init];
[xVals addObject:myQuota.rowName];
NSMutableArray *yVals = [[NSMutableArray alloc] init];
double val = [myQuota.quotaReached doubleValue]; // here is 2
[yVals addObject:[[BarChartDataEntry alloc] initWithValue:val xIndex:0]];
[yVals addObject:[[BarChartDataEntry alloc] initWithValue: MY_MAX_VALUE xIndex:1]];
}
I am using ios-charts library (Ios Charts) for graphs (line , bar).my issue is that few cases y axis labels are not showing.
please help me to resolve this.
here what my code is
ChartYAxis *leftAxis = _barChartView.leftAxis;
leftAxis.startAtZeroEnabled = YES;
leftAxis.labelFont = [UIFont systemFontOfSize:10.f];
leftAxis.labelCount = 8;
leftAxis.valueFormatter = [[NSNumberFormatter alloc] init];
leftAxis.valueFormatter.maximumFractionDigits = 1;
leftAxis.axisLineColor = [UIColor blackColor];
leftAxis.axisLineWidth = 1.0;
leftAxis.labelPosition = YAxisLabelPositionOutsideChart;
leftAxis.spaceTop = 0.15;
BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithYVals:yVals label:#"Legend"];
NSMutableArray *dataSets = [[NSMutableArray alloc] init];
[dataSets addObject:set1];
BarChartData *data = [[BarChartData alloc] initWithXVals:xvalues dataSets:dataSets];
[data setValueFont:[UIFont fontWithName:#"HelveticaNeue-Light" size:10.f]];
_barChartView.leftAxis.startAtZeroEnabled = NO;
_barChartView.data = data;
The below solved my problem.
leftAxis.labelCount = 5;
leftAxis.forceLabelsEnabled = YES;
I have a view controller that's just a full screen ios-chart view nested in a nav controller. This was working in October and I've looked through my git repo and nothing has changed about this file. However I did pull in the latest version from the repo and I achieved the same results.
So first I have a setup function that sets up chart:
if (vertical)
{
self.barChart = [[BarChartView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}
else
{
self.barChart = [[HorizontalBarChartView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}
self.barChart.backgroundColor = [UIColor clearColor];
self.barChart.delegate = self;
self.barChart.descriptionText = #"";
self.barChart.noDataTextDescription = #"";
self.barChart.drawBarShadowEnabled = NO;
self.barChart.drawValueAboveBarEnabled = YES;
self.barChart.rightAxis.drawLabelsEnabled = NO;
self.barChart.rightAxis.drawGridLinesEnabled = NO;
self.barChart.maxVisibleValueCount = 60;
self.barChart.pinchZoomEnabled = NO;
self.barChart.drawGridBackgroundEnabled = NO;
self.barChart.backgroundColor = [UIColor whiteColor];
ChartXAxis *xAxis = self.barChart.xAxis;
xAxis.labelPosition = XAxisLabelPositionBottom;
xAxis.labelFont = [UIFont systemFontOfSize:10.f];
xAxis.drawGridLinesEnabled = NO;
xAxis.spaceBetweenLabels = 0;
ChartYAxis *leftAxis = self.barChart.leftAxis;
leftAxis.labelFont = [UIFont systemFontOfSize:10.f];
leftAxis.labelCount = 3;
leftAxis.drawGridLinesEnabled = YES;
leftAxis.valueFormatter = [[NSNumberFormatter alloc] init];
leftAxis.valueFormatter.maximumFractionDigits = 0;
leftAxis.valueFormatter.positivePrefix = #"$";
leftAxis.valueFormatter.negativePrefix = #"-$";
leftAxis.labelPosition = YAxisLabelPositionOutsideChart;
leftAxis.spaceTop = 0.25;
[self.barChart.legend setEnabled:false];
[self refresh]; //refreshes data for charting
Refresh on self grabs the JSON off my website and forms it into an array of dictionaries and then calls this:
NSMutableArray *xAxis = [[NSMutableArray alloc] init];
NSMutableArray *yAxis = [[NSMutableArray alloc] init];
for (int x = 0; x < data.count; x++) {
[xAxis addObject:data[x][#"title"]];
[yAxis addObject:[[BarChartDataEntry alloc] initWithValue:floor([data[x][#"value"] doubleValue]) xIndex:x]];
}
BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithYVals:yAxis label:self.barTitle];
set1.barSpace = 0.35;
set1.colors = #[[[UIColor alloc] initWithRed:0.007843137255 green:0.2117647059 blue:0.4470588235 alpha:1]];
set1.valueFormatter = [[NSNumberFormatter alloc] init];
set1.valueFormatter.positivePrefix = #"$";
set1.valueFormatter.negativePrefix = #"-$";
[set1.valueFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
set1.valueFormatter.maximumFractionDigits = 0;
NSMutableArray *dataSets = [[NSMutableArray alloc] init];
[dataSets addObject:set1];
BarChartData *barData = [[BarChartData alloc] initWithXVals:xAxis dataSets:dataSets];
[barData setValueFont:[UIFont fontWithName:#"HelveticaNeue-Light" size:10.f]];
self.barChart.data = barData;
The dataset is correct and gets all 24 values and appears to setup the xAxis and yAxis correctly but after all this, my chart just displays "No chart data available"
I've searched around and didn't find many articles on this but one suggestion was use dispatch_after to run setNeedsDisplay on the bar chart:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.barChart setNeedsDisplay];
});
I've tried that code with 30 seconds as my timer to be absolutely sure the chart library finished doing what it needs to with that data and still the chart shows no data.
Any and all help would be appreciated. Thanks in advance!