Hi,
I’ve been looking through ways to have to y-Axis scale for really small changes/values.
For example, I’m attempting to plot 10 values between 0.99300 to 0.99400, and the changes between points can vary between 0.001 to 0.0001 or so (basically, really small changes)
However, my y-Axis seems to always start at 0 and the y-Axis major ticks are always at most a 0.1 difference, making the graph look flat.
I’d like to achieve the following:
– Scale to the smallest value i can scale to.
– Have my y-Axis to not necessarily start at 0.
I’ve tried the following:
Setting up y-Axis:
self.yAxis = [SCINumericAxis new];
[self.yAxis setStyle:axisStyle];
self.yAxis.axisId = @"yAxis";
[self.yAxis setGrowBy:[[SCIDoubleRange alloc]initWithMin:SCIGeneric(0) Max:SCIGeneric(0.1)]];
[self.yAxis setAutoRange:SCIAutoRange_Always];
[self.chartSurface attachAxis:self.yAxis IsXAxis:NO];
Regards.
- Develle Yong asked 7 years ago
- last active 7 years ago
Hi guys,
I am having difficulties setting the background of my bar chart with SCICategoryDateTime X axis since I switched to 2.0.
As far as I understand, just setting the background property of the SCIChartSurface should suffice.
These are all of the things I’ve tried:
1. [self.barSurface setBackgroundColor:[UIColor clearColor]];
2. [self.barSurfaceView setBackgroundColor:[UIColor clearColor]];
3. self.barSurface.renderableSeriesAreaFill = [[SCISolidBrushStyle alloc] initWithColor:[UIColor clearColor]];
4. [self.barSurface.renderSurface setIsTransparent:YES];
I didn’t find any other way of setting it, but it still remains black. Any thought on what might cause it?
EDIT: I just found out about this color setting:
[axisStyle setGridBandBrush:[[SCISolidBrushStyle alloc] initWithColor:[UIColor whiteColor]]];
The result I got was a black and white chess board, as shown on the attached picture. I really don’t understand this behaviour. If I set this gridBandBrush to nil, columns are coloured with random colours, so the chart looks like a rainbow. I understand why is this happening but shouldn’t there be a default colour in case brush is nil?
EDIT 2: While debugging using “Capture view hierarchy” in XCode I discovered that render surface is actually white inside debugger. Perhaps it will give more insight to you, it doesn’t mean much to me – I guess it’s because rendering is done on GPU and the context is not available to the debugger.
Best,
Igor
- Igor Peric asked 7 years ago
- last active 7 years ago
Hi, guys
I want to show two renderableSeries on one chart view. These series have common x-axis (SCICategoryDateTimeAxis) and separate y-axes(SCINumericAxis). Only one of y-axis is visible at chart view. Also the data series of visible renderable series updated by scrolling to left or to right. So for displaying on one view i’m using:
[y1Axis setGrowBy: [[SCIDoubleRange alloc] initWithMin:SCIGeneric(0.3) Max:SCIGeneric(0.07)]];
[y2Axis setGrowBy: [[SCIDoubleRange alloc] initWithMin:SCIGeneric(0.0) Max:SCIGeneric(5)]];
So it’s look good at start (Correct_zooming.png). But after some scrolling it decrease axis extents of invisible y-axis (decrease.png).
Or even breaks down (broken.png)
For test i’m using SCIFastOhlcRenderableSeries and SCIHorizontallyStackedColumnsCollection readerable series.
Data series for SCIHorizontallyStackedColumnsCollection is initializated like:
[volumeSerie1 updateAt:index Y:SCIGeneric(100000 / [multiplier doubleValue])];
[volumeSerie2 updateAt:index Y:SCIGeneric(500000 / [multiplier doubleValue])];
So can you look at it?
Or what way i should implement this behavior?
Best regards,
Sushynski Andrei
- Andrei Sushynski asked 7 years ago
- last active 7 years ago
I’ve got error message during compilation:
ld: bitcode bundle could not be generated because '.../Frameworks/SciChart.framework/SciChart' was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build for architecture armv7
I temporary disabled bitcode for target. Will you fix it in the next build?
- Alexander Edunov asked 8 years ago
- last active 8 years ago
Hello,
I recently updated 2 different apps that both use SciChart with XCode14 and uploaded the archives to the App Store via Organizer. They both generated the warning/error:
“The app references non-public selectors in …/Frameworks/SciChart.framework/SciChart: moveToX:y:”
This did not occur with Xcode 13.
Any advice on how best to handle this?
Thank you.
- C Bolton asked 2 years ago
- last active 1 year ago
Hi,
I’ve encountered an issue with the candlestick graph I’ve drawn that consists of a set of random X date time values – this causes the candlesticks have varying distances from one another.
Rendering the data from an initial set seems to be fine but as I run a NSTimer to add on more points, the body of the new candlesticks seem to be 0. (Note, the date time values are still random but have been made to be set after the last placed point)
In fact, the initial data points that I added see to be rendered ‘body-less’ if it’s within the same visible range as the newly added points. And if I pan along the newly added points, the bodies of some data points will appear at random visible ranges.
Is this a normal behaviour or should I take anything else into consideration?
Here are a couple of my configurations which I think may have affected anything:
1. My XAxis has set its visible range limit mode to ClipMode_Min
2. Candlestick series style data body width is set to be default.
3. I have a the following modifiers set up.
self.xDragModifier = [SCIXAxisDragModifier new];
self.xDragModifier.axisId = @"xAxis";
self.xDragModifier.dragMode = SCIAxisDragMode_Pan;
self.xDragModifier.clipModeX = SCIZoomPanClipMode_ClipAtMin;
[self.xDragModifier setModifierName:@"XAxis DragModifier"];
self.pinchZoomModifier = [[SCIPinchZoomModifier alloc] init];
[self.pinchZoomModifier setModifierName:@"PinchZoom Modifier"];
self.pinchZoomModifier.xyDirection = SCIXYDirection_XDirection;
self.zoomPanModifier = [SCIZoomPanModifier new];
self.zoomPanModifier.clipModeX = SCIZoomPanClipMode_ClipAtMin;
self.zoomPanModifier.xyDirection = SCIXYDirection_XDirection;
[self.zoomPanModifier setModifierName:@"ZoomPan Modifier"];
SCIModifierGroup * gm = [[SCIModifierGroup alloc] initWithChildModifiers:@[self.xDragModifier, self.pinchZoomModifier, self.zoomPanModifier]];
self.chartSurface.chartModifier = gm;
The points are drawing just fine, but the body of the candlestick is not appearing as expected.
Thanks in advance.
- Elle Yeoh asked 7 years ago
- last active 7 years ago
Hello,
I’ve been looking for the documentation of how to customize the look of the chart. I have a black/dark gray checker pattern that seems to be the default. I would like to:
1. Change the background to white, no checkerboard pattern
here is the documentation for chart background but it does not show me how to change it to white. https://www.scichart.com/documentation/ios/v2.x/webframe.html#The%20SciChartSurface%20Type.html
I have found through experimentation the I can call
surface.backgroundColor
But that just changes the axis background color
2. Make the text larger on the axis.
here is the documentation for the axis https://www.scichart.com/documentation/ios/v2.x/webframe.html#Adding%20an%20Axis%20to%20a%20SciChartSurface.html
I see these lines that were provided but they won’t compile because Xcode doesn’t know what defaultFontSize is and there are no other references to it and I still don’t see a way to set the size.
textFormat.fontName = SCSFontsName.defaultFontName
textFormat.fontSize = SCSFontSizes.defaultFontSize
I think it would be helpful to create a walkthrough for iOS that shows how to customize the background and axis. I’ve looked through the samples provided but the files are huge and I get lost trying to figure it out.
Thanks,
Warren
- Warren Hansen asked 7 years ago
- last active 2 years ago
Hello,
I need to display realtime chart with 20 series of data. My data is arriving at 500Hz. When I’m displaying this data, I find that after a while SciChart hangs with what appears to be a deadlock.
I’ve read as much as I can find about realtime graphing with SciChart and I started with tutorial 4 – Adding Realtime Updates. This article (https://www.scichart.com/questions/wpf/is-xydataseries-safe-to-being-changed-in-a-separate-thread) suggests that SciChart is thread safe so I tried using a second thread to feed data into a graph. My only change was to move from the main thread timer in the example to a GCD timer running at 500Hz. With this, I’m easily able to reproduce the deadlock in around 1.5 seconds.
Here is the main thread which is attempting to render:
Thread 1 Queue : com.apple.main-thread (serial)
#0 0x0000000192bc8c20 in __psynch_rw_rdlock ()
#1 0x0000000192ae4864 in _pthread_rwlock_lock_wait ()
#2 0x0000000192ae47fc in _pthread_rwlock_lock_slow$VARIANT$mp ()
#3 0x0000000104a93828 in -[SCIRenderableSeriesLock initWithRenderableSeries:] ()
#4 0x0000000104ab742c in -[SCIRenderSurfaceRenderer p_SCI_updateCoreData:renderPassState:viewportSize:] ()
#5 0x0000000104ab6f4c in -[SCIRenderSurfaceRenderer p_SCI_renderLoop:assetManager:renderPassState:] ()
#6 0x0000000104ab6dc4 in -[SCIRenderSurfaceRenderer onDrawWithContext:andAssetManager:] ()
#7 0x00000001049c50c0 in -[SCIRenderSurfaceDrawable2D drawFrameIn:withDrawableSize:] ()
#8 0x0000000104ad4db8 in -[SCITwisterRendererBase drawFrameIn:withDrawableSize:] ()
#9 0x00000001049e56c8 in -[SCIMetalRenderer drawFrameIn:withDrawableSize:] ()
#10 0x0000000104a25b70 in -[SCIMetalRenderSurfaceBase draw] ()
#11 0x00000001999861ec in -[CALayer display] ()
#12 0x00000001999984d4 in CA::Layer::layout_and_display_if_needed(CA::Transaction*) ()
#13 0x00000001998e11d8 in CA::Context::commit_transaction(CA::Transaction*, double) ()
#14 0x000000019990ab78 in CA::Transaction::commit() ()
#15 0x000000019990b58c in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
#16 0x0000000192d50fbc in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#17 0x0000000192d4beb0 in __CFRunLoopDoObservers ()
#18 0x0000000192d4c32c in __CFRunLoopRun ()
#19 0x0000000192d4bc38 in CFRunLoopRunSpecific ()
#20 0x000000019d39a38c in GSEventRunModal ()
#21 0x0000000196e7c444 in UIApplicationMain ()
#22 0x00000001042cc478 in main at /Users/mall/Downloads/SciChart.iOS.Examples-SciChart_v3_Release/tutorials/tutorials-2d/Tutorial 04 - Adding Realtime Updates/Tutorial 04 - Adding Realtime Updates/AppDelegate.swift:5
#23 0x0000000192bd38f0 in start ()
and here is my worker thread adding data to a series:
Thread 11 Queue : com.apple.root.default-qos.overcommit (concurrent)
#0 0x0000000192bc8c20 in __psynch_rw_rdlock ()
#1 0x0000000192ae4864 in _pthread_rwlock_lock_wait ()
#2 0x0000000192ae47fc in _pthread_rwlock_lock_slow$VARIANT$mp ()
#3 0x0000000104ac1518 in -[SCIXDataSeries p_SCI_searchDataIndexOn:xMinAsDouble:xMaxAsDouble:downSearchMode:upSearchMode:] ()
#4 0x0000000104ac1368 in -[SCIXDataSeries getIndicesXRange:xMinAsDouble:xMaxAsDouble:isCategoryAxis:] ()
#5 0x0000000104ac1b34 in -[SCIXDataSeries getWindowYRangeWithXCoordCalc:getPositiveRange:] ()
#6 0x0000000104aceddc in -[SCIRenderableSeriesBase getYRange:positive:] ()
#7 0x00000001049b25ac in -[SCIRangeCalculationHelper2DBase getWindowedYRangeWithXCalculators:] ()
#8 0x0000000104a05f84 in -[SCIAxisBase getWindowedYRangeWithXRanges:] ()
#9 0x00000001049f4184 in -[SCIChartSurface p_SCI_zoomExtentsYWithCalculators:andDuration:] ()
#10 0x00000001049f3d14 in -[SCIChartSurface p_SCI_zoomExtentsWithDuration:] ()
#11 0x00000001042c79e8 in closure #1 in ViewController.handleTimer() at /Users/mall/Downloads/SciChart.iOS.Examples-SciChart_v3_Release/tutorials/tutorials-2d/Tutorial 04 - Adding Realtime Updates/Tutorial 04 - Adding Realtime Updates/ViewController.swift:84
#12 0x00000001042c7500 in thunk for @escaping @callee_guaranteed () -> () ()
#13 0x0000000104abdae0 in +[SCIUpdateSuspender usingWithSuspendable:withBlock:] ()
#14 0x00000001042c7824 in ViewController.handleTimer() at /Users/mall/Downloads/SciChart.iOS.Examples-SciChart_v3_Release/tutorials/tutorials-2d/Tutorial 04 - Adding Realtime Updates/Tutorial 04 - Adding Realtime Updates/ViewController.swift:79
#15 0x00000001042c9250 in partial apply ()
#16 0x00000001042cb1e4 in closure #1 in closure #1 in RepeatingTimer.timer.getter at /Users/mall/Downloads/SciChart.iOS.Examples-SciChart_v3_Release/tutorials/tutorials-2d/Tutorial 04 - Adding Realtime Updates/Tutorial 04 - Adding Realtime Updates/RepeatingTimer.swift:26
#17 0x00000001042c7500 in thunk for @escaping @callee_guaranteed () -> () ()
#18 0x0000000107093730 in _dispatch_client_callout ()
#19 0x0000000107096390 in _dispatch_continuation_pop ()
#20 0x00000001070a9614 in _dispatch_source_invoke ()
#21 0x00000001070a4d74 in _dispatch_root_queue_drain ()
#22 0x00000001070a5698 in _dispatch_worker_thread2 ()
#23 0x0000000192aeab38 in _pthread_wqthread ()
Here is my version of the ViewController class from Tutorial 4 with the GCD timer (note that it uses RepeatingTimer class found here: https://gist.github.com/danielgalasko/1da90276f23ea24cb3467c33d2c05768) – my changes are marked with the //MALL comment:
import UIKit
import SciChart
class ViewController: UIViewController {
//MALL
private var timer = RepeatingTimer(timeInterval: 1.0/500.0)
private let pointsCount = 200
private var count: Int = 0
private let lineData = SCIDoubleValues()
private lazy var lineDataSeries: SCIXyDataSeries = {
let lineDataSeries = SCIXyDataSeries(xType: .int, yType: .double)
lineDataSeries.seriesName = "Line Series"
lineDataSeries.fifoCapacity = 300
return lineDataSeries
}()
private let scatterData = SCIDoubleValues()
private lazy var scatterDataSeries: SCIXyDataSeries = {
let scatterDataSeries = SCIXyDataSeries(xType: .int, yType: .double)
scatterDataSeries.seriesName = "Scatter Series"
scatterDataSeries.fifoCapacity = 300
return scatterDataSeries
}()
private var surface: SCIChartSurface {
return view as! SCIChartSurface
}
override func loadView() {
viewRespectsSystemMinimumLayoutMargins = false
view = SCIChartSurface()
}
override func viewDidLoad() {
super.viewDidLoad()
let xValues = SCIIntegerValues()
for i in 0 ..< pointsCount {
xValues.add(Int32(i))
lineData.add(sin(Double(i) * 0.1))
scatterData.add(cos(Double(i) * 0.1))
count += 1
}
lineDataSeries.append(x: xValues, y: lineData)
scatterDataSeries.append(x: xValues, y: scatterData)
let lineSeries = SCIFastLineRenderableSeries()
lineSeries.dataSeries = lineDataSeries
let pointMarker = SCIEllipsePointMarker()
pointMarker.fillStyle = SCISolidBrushStyle(colorCode: 0xFF32CD32)
pointMarker.size = CGSize(width: 10, height: 10)
let scatterSeries = SCIXyScatterRenderableSeries()
scatterSeries.dataSeries = scatterDataSeries
scatterSeries.pointMarker = pointMarker
let legendModifier = SCILegendModifier()
legendModifier.orientation = .horizontal
legendModifier.position = [.bottom, .centerHorizontal]
legendModifier.margins = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
SCIUpdateSuspender.usingWith(self.surface) {
self.surface.xAxes.add(items: SCINumericAxis())
self.surface.yAxes.add(items: SCINumericAxis())
self.surface.renderableSeries.add(items: lineSeries, scatterSeries)
self.surface.chartModifiers.add(items: SCIPinchZoomModifier(), SCIZoomExtentsModifier())
self.surface.chartModifiers.add(items: SCIRolloverModifier(), legendModifier)
}
// MALL
timer.eventHandler = handleTimer
timer.resume()
}
// MALL
private func handleTimer() {
let x = count
SCIUpdateSuspender.usingWith(surface) {
self.lineDataSeries.append(x: x, y: sin(Double(x) * 0.1))
self.scatterDataSeries.append(x: x, y: cos(Double(x) * 0.1))
// zoom series to fit viewport size into X-Axis direction
self.surface.zoomExtents()
self.count += 1
}
}
}
Thanks in advance for any help you can offer.
- Mark Alldritt asked 4 years ago
- last active 4 years ago
Hi, guys
My x axis is SCICategoryDateTimeAxis class type. And it’s limited by VisiableRangeLimit like:
[xAxis setVisibleRangeLimit:[[SCIDoubleRange alloc] initWithMin:SCIGeneric(firstItem – (lastItem – priorItem))
Max:SCIGeneric(lastItem + (lastItem – priorItem))]];
Also for scrolling my content inside chart:
SCIZoomPanModifier * zpm = [[SCIZoomPanModifier alloc] init];
[zpm setModifierName:@"PanZoom Modifier"];
[zpm setClipModeX:SCIZoomPanClipMode_ClipAtExtents];
Like a description SCIZoomPanClipMode_ClipAtExtents says:
“forces the panning operation to stop suddenly at the extents of the data” – but it’s not working constantly.
Sometimes it’s allow to scroll outside the range. Like on the attached image.
So my question is how to limit scrolling by min and max value?
Best regards,
Sushynski Andrei
- Andrei Sushynski asked 7 years ago
- last active 7 years ago
From your documentation:
4.9 Annotations
SciChart features a rich Annotations API, that allows you to place UIKit UIElements over the chart.
SciChat provides a number of built-in annotations, but you can also create your own.
SCIBoxAnnotation, SCILineAnnotation and SCITextAnnotation are cool, but sometimes it’s not enough.
Is it possible to render UIView on the chart (at least UIImage)?
Is it possible to draw dashed line annotation?
Could you provide an example of creating custom annotation class?
- Alexander Edunov asked 8 years ago
- last active 7 years ago
We need to generate adhoc ipa file for review purpose and we are using the trial version, but its fails. Can you help us on the same?
- Nathaniel Thomas asked 4 years ago
- last active 4 years ago
Hi,
I’m trying to convert Java code to swift and I need the same CustomCategoryDateAxis class as Yura’s answer: https://www.scichart.com/questions/android/setvisiblerangelimitmode-on-xaxis
I try to inherit from SCICategoryDateAxis but there is no isZoomConstrainSatisfied and coerceVisibleRange overrides.
How can i write the same code in swift?
Tnx.
- apiftechnics api asked 4 years ago
- last active 4 years ago
Hi, guys
What is the minimum required sdk version for SciChart v.2?
Such as i have some trouble with IOS 9. See attachment.
Same behavior at real devices.
Can you look at this?
Best regards,
Sushynski Andrei
- Andrei Sushynski asked 7 years ago
- last active 7 years ago
I didn’t see anything in any docs, so I am just wanting to verify this info…
Is this correct that you have to link in and ship the libSwiftCore (+ other swift libs) with an app using SciCharts on iOS? When I added the chart library to my app; the app crashed at startup with missing dynamic load of libSwiftCore.dylib on a real device (emulators run fine).
Enabling ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES in the build settings fixed this issue. But this surprised me that the SciChart library would actually require Swift.
Was this intentional; or did the library somehow pickup an unintentional reference somewhere….
- Nathanael Anderson asked 4 years ago
- last active 4 years ago
Hi
I am developing a Xamarin iOS application and I’m using a SCIPieChartSurface. I can create the chart and set its values, but is is not possible to auto-update the donut with new data.
I am trying to update the value by doing:
myDonut.MyPieSegment.Value = newValue;
But nothing happends…
I heard it was a bug in the API for Android a month ago, is this similar? Or am I doing something wrong?
Thanks in advance!
Best regards
Jonas
- Jonas Olsson asked 6 years ago
- last active 4 years ago
Hi all,
I’m trying to use the metal support in a little test project.
I have following lines to enable metal:
if SCIChartSurface.isMetalSupported {
sciChartSurface.renderSurface = SCIMetalRenderSurface(frame: sciChartSurface.bounds)
} else {
sciChartSurface.renderSurface = SCIOpenGLRenderSurface(frame: sciChartSurface.bounds)
}
the surface keeps empty until I remove the
sciChartSurface.renderSurface = SCIMetalRenderSurface(frame: sciChartSurface.bounds)
line – or in other words I use OpenGL.
Then the chart will render properly. I am using an iPhoneX (not simulator).
Thank you for your support!
Wall of Code:
import UIKit
import SciChart
import SnapKit
class ViewController: UIViewController {
// MARK: - UIElements
private var sciChartSurface: SCIChartSurface!
// MARK: - Vars
private var series: SCIXyDataSeries?
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
setupSurface()
setupData()
renderData()
}
// MARK: - Chart
private func setupSurface() {
// Create a SCIChartSurface. This is a UIView so can be added directly to the UI
sciChartSurface = SCIChartSurface.init(frame: view.bounds)
sciChartSurface.debugWhySciChartDoesntRender = true
view.addSubview(sciChartSurface)
// Detect metal with this static property
if SCIChartSurface.isMetalSupported {
sciChartSurface.renderSurface = SCIMetalRenderSurface(frame: sciChartSurface.bounds)
} else {
sciChartSurface.renderSurface = SCIOpenGLRenderSurface(frame: sciChartSurface.bounds)
}
sciChartSurface.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
sciChartSurface.translatesAutoresizingMaskIntoConstraints = true
sciChartSurface.backgroundColor = .gray
// Create an XAxis and YAxis. This step is mandatory before creating series
let xAxis = SCICategoryNumericAxis()
setup(axis: xAxis)
sciChartSurface.xAxes.add(xAxis)
let yAxis = SCINumericAxis()
setup(axis: yAxis)
sciChartSurface.yAxes.add(yAxis)
}
private func setup(axis: SCIAxisBase) {
let axisStyle = SCIAxisStyle()
let majorPen = SCISolidPenStyle(colorCode: 0xFF393532, withThickness: 0.5)
let minorPen = SCISolidPenStyle(colorCode: 0xFF262423, withThickness: 0.5)
let textFormat = SCITextFormattingStyle()
textFormat.fontSize = 16
axisStyle.majorTickBrush = majorPen
axisStyle.majorGridLineBrush = majorPen
axisStyle.gridBandBrush = SCISolidBrushStyle(colorCode: 0xE1232120)
axisStyle.minorTickBrush = minorPen
axisStyle.minorGridLineBrush = minorPen
axisStyle.labelStyle = textFormat
axisStyle.drawMinorGridLines = true
axisStyle.drawMajorBands = true
axis.style = axisStyle
}
private func setupData() {
series = SCIXyDataSeries(xType: .int16, yType: .int16)
TestData.testData.forEach { (testData) in
let xGeneric = SCIGenericType(type: .int16, .init(int32Data: testData.x))
let yGeneric = SCIGenericType(type: .int16, .init(int32Data: testData.y))
series?.appendX(xGeneric, y: yGeneric)
}
}
private func renderData() {
let renderSeries = SCIFastColumnRenderableSeries()
renderSeries.dataSeries = series
sciChartSurface.renderableSeries.add(renderSeries)
}
}
struct TestData {
var x: Int32
var y: Int32
static let testData = [TestData(x: 2017, y: 5),
TestData(x: 2018, y: 8),
TestData(x: 2019, y: 2),
TestData(x: 2020, y: 9)]
}
- Hubert Weid asked 5 years ago
- last active 5 years ago
Is the styleFor function of SCIPaletteProvider that was in Version 2.0 not implemented in Version 4.8?
Also, are there any plans to implement it?
I am upgrading from SciCharts 2.0.1 to SciCharts 4.3.
When the color was set using SCI Palatt Provider in Version 2.0, the memory used was 200M, but in Version 4.3, the memory used may consume as much as 1G.
I tried to devise it by setting the Sampleing Mode, but it is not very effective.
SCI Charts is used to display the spectrum data of audio data while playing the sound.
- Keiji Sakamoto asked 2 years ago
- last active 2 years ago
I was testing my charts on a simulator and when I naved away and then back to the chart screen the Simulator’s chart was totally black screen; I could move the mouse over the points and the popouts would occur; and your license notice showed in the center of the chart. So it was almost like it thought all the drawing for the chart itself needed to be black on black.
It was always broken on the 2nd or later chart. Restarting the app fixed it. I tried removing all custom settings, and calling the invalidate; and nothing caused it to redraw correctly… Fortunately, when deploying to real devices everything worked correctly. Is this an expected side effect of testing on a simulator, or is their something that I can do to force a hard refresh of the chart…
FYI: The additional debug diagnostics don’t seem to do anything on a simulator, or at least I couldn’t find anywhere it was logged.
- Nathanael Anderson asked 4 years ago
- last active 4 years ago
Hi,
I’m trying to achieve the looks of DateTimeCategory XAxis as shown on uploaded screenshot.
Formatting a single row of tick labels is not a hard task (setTextFormatting). The problem arises when there are 2 rows with same frequency (days of the week and dates) and third row with lower frequency (years).
I tried using new line character in text formatting property to break the line for days and dates and it didn’t work. I also tried having two axes bound to the same data series, each one having different formatting and majorDelta, but it seems that they don’t stack up (only first one added is shown).
Any ideas?
- Igor Peric asked 7 years ago
- last active 7 years ago
I’m try to generate a UIImage from a SCIChartSurface into a graphic context using the code below from a view that is not displayed on the screen. The image created is pure black, which indicates it did not draw. If I display the graph in a view on the devices screen, the graph draws correctly.
UIGraphicsBeginImageContextWithOptions(self.chart.bounds.size, NO, 0.0);
[self.chart drawViewHierarchyInRect:self.chart.bounds afterScreenUpdates:YES];
UIImage *chartImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Are there any special steps that are needed to draw into a graphic context?
- Brian Smith asked 5 years ago
- last active 10 months ago
When search this forum, I found that we can achieve it by adding point marker. But I am getting this error when trying to add point marker :
‘Operation: setPointMarker: is not avaliable on type: SCIHorizontallyStackedColumnsCollection’
let me know this feature(round top corners of bars) is availble or not ! Or is there any way to do this ?
- Nathaniel Thomas asked 4 years ago
- last active 4 years ago
Can someone please point me to where I can complete this tutorial.
Why end this tutorial like this??
// That’s it! The SCIChartSurface will now display on the screen with default axis ranges
As is, it simply displays the x and y values. Nothing else.
How can I add my x and y values so that I can display my graph
- Robert De Saeger asked 6 years ago
- last active 6 years ago
Hello, I’m new to Swift and macOS, but I’m tasked to research SciChart. I have started my macOS trial, got my trial code from the wizard app. I’m following the Creating your first SciChart macOS App
tutorial but I get Sorry! Your license token appears to be invalid
error.
Here is what I’ve tried:
import Cocoa
import SciChart
import AppKit
@main
class AppDelegate: NSObject, NSApplicationDelegate {
// override init() {
// SCIChartSurface.setRuntimeLicenseKey("XXX")
// }
func applicationDidFinishLaunching(_ aNotification: Notification) {
let licenseKey = "XXX"
SCIChartSurface.setRuntimeLicenseKey(licenseKey)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
return true
}
}
Using override init()
leads to Terminating app due to uncaught exception 'License Exception', reason: ''
Using SCIChartSurface.setRuntimeLicenseKey()
in applicationDidFinishLaunching
leads to Sorry! Your license token appears to be invalid. Please contact support with your OrderID if you believe this to be incorrect.
What am I doing wrong?
- Tihomir Manushev asked 1 year ago
- last active 1 year ago
Hello Team,
In Pie Chart with DonutSeries, the segment spacing seems to have no effect on graph.
donutSeries.segmentSpacing = 10
Thanks
- Sandeep Dhull asked 5 years ago
- last active 4 years ago
Hello everyone.
We are trying to migrate to V3 in our iOS project and we have many issues.
One of the most important is the implementation of vertically-draggable horizontal lines.
I have a nice working code for SCICharts V2 but I cannot find any similar example of how we can implement a custom modifier for moving an SCIHorizontalLineAnnotation vertically in V3.
We have done it already with the V2 but now that we have to migrate to V3 there is a huge missing part in your documentation.
Our code was using-overiding onPanGesture() in order to figure out if the modifier should handle the touching event, then we were using the touch point in order to find the closer horizontal lines and choose the closest one in order to change the vertical value depending on the touching-changing point.
The only similar example that I found in your documentation (https://www.scichart.com/example/ios-custom-modifier/) is using SCIGestureModifier which is not accesible by the V3.
I am trying to use your SCIChartModifierBase class but cannot find anywhere a similar example of what we need.
I already tried to understand how you want us to use the ” override func onEvent(_ args: SCIModifierEventArgs!) ” function of the
SCIChartModifierBase but still no luck, it is impossible to figure out without any kind of a similar example.
The reason of needing an example is that this task needs much more information like these:
1. How to decide if the modifier should handle the touch event and how it should be ignored or handled by the next modifier in the same group ?
2. How to handle the touch started, changed, cancelled events ?
3. How to say in realtime to other modifiers in the same group that we need to to handle the same event simultaneously with this custom modifier ?
4. How to say to the group of modifiers that after the first modifer is taken the touch event then the rest should not use it ?
I will paste here our current implementation that we have done for V2 and needs to be transformed to V3 in case you need more details.
An important part is how we add the modifiers on the chart and this is how we are doing it right now:
let zoom = SCIPinchZoomModifier()
zoom.direction = .xDirection
let group = SCIChartModifierCollection(collection: [CustomModifier(chart: self),
PanModifier(),
zoom])
//group.handleGestureFirstOnly = true // Not existing in V3 anymore ! How should we do it in V3 ?
chart.chartModifiers = group
I believe that this code will be really useful for many people out there even for V2 or for migrating to V3.
Swift iOs code using SCICharts V2:
class Modifier: SCIGestureModifier {
private weak var control: ChartView?
private var editingProperty: ChartView.BindableProperty?
private var calculator: SCICoordinateCalculatorProtocol?
init(chart: ChartView?) {
self.control = chart
}
override func onPanGesture(_ gesture: UIPanGestureRecognizer?, at view: UIView?) -> Bool {
guard let chart = view as? SCIChartSurface,
let gesture_ = gesture
else { return super.onPanGesture(gesture, at: view) }
let location = gesture_.location(in: chart)
switch gesture_.state {
case .began:
control?.sendActions(for: .touchDown)
editingProperty = testForDraggableLine(location: location, in: chart)
calculator = yAxis().getCurrentCoordinateCalculator()
if editingProperty != nil {
// Annotations on SciChart don't have Zindex and we want current line to be on the top
let draggableLines = control?.chart.annotations.array.compactMap { $0 as? DraggableLine }
if let myLine = draggableLines?.first(where: { $0.bindingKeyValue == editingProperty }) {
control?.chart.annotations.remove(myLine)
control?.chart.annotations.add(myLine)
}
control?.isTouchingLine(isTouching: editingProperty != nil)
}
return editingProperty != nil
case .changed:
if editingProperty != nil {
handleDraggingLines(location: location, in: chart)
return true
}
case UIGestureRecognizer.State.ended:
if editingProperty != nil {
control?.sendActions(for: .editingDidEnd)
editingProperty = nil
_ = control?.adjustYRange(force: true)
control?.sendActions(for: .valueChanged)
control?.refreshPositions()
control?.isNotTouchingLine()
return true
}
case UIGestureRecognizer.State.cancelled:
if editingProperty != nil {
control?.sendActions(for: .editingDidEnd)
editingProperty = nil
_ = control?.adjustYRange(force: true)
control?.sendActions(for: .valueChanged)
control?.refreshPositions()
control?.isNotTouchingLine()
return true
}
default:
break
}
return false
}
private func handleDraggingLines(location: CGPoint, in chart: SCIChartSurface) {
guard let renderSurface = chart.renderSurface,
let yCalculator = self.calculator,
let editingProperty = editingProperty else { return }
let pointInChart = renderSurface.point(inChartFrame: location)
let valueForYAxis = yCalculator.getDataValue(from: Double(pointInChart.y))
control?.setValue(Decimal(valueForYAxis), forKey: editingProperty.rawValue)
}
// SOS: Filter possible properties that can be returned. We want to always avoid return - and then - dragging the current price bid or ask !
private func testForDraggableLine(location: CGPoint, in chart: SCIChartSurface) -> ChartView.BindableProperty? {
let hitTestDistance: Double = 30 // Pixels !
let nearItems = chart.annotations.array
.compactMap { $0 as? DraggableLine }
.filter { item in
return item.bindingKeyValue != ChartView.BindableProperty.ask &&
item.bindingKeyValue != ChartView.BindableProperty.bid &&
!item.isHidden &&
item.yDistance(from: location) <= hitTestDistance
}
return nearItems
.sorted { $0.yDistance(from: location) < $1.yDistance(from: location) }
.first?.bindingKeyValue
}
}
- Dxat asked 4 years ago
- last active 3 years ago
Hello!
Great work, thanks a lot for this framework!
Could you provide an example of animated inserting of a new point? My goal is to implement interpolation between previous retrieved and last point on the real-time line chart.
- Alexander Edunov asked 8 years ago
- last active 2 years ago
I have just learned how to use sci-chart framework with tutorials.
And I tried to add values from bluetooth as realtime chart as shown in tutorials.
I have finished receiving data from a Bluetooth connection.
However, using scichart to represent this data in real time is hard to solve by looking at the tutorial alone.
Does anyone have any idea how to use real-time tutorials to teach you how to represent your own data, not the example sine graph?
The code below is what I tried and is wrong.
import UIKit
import CoreBluetooth
import SciChart
let maestroServiceCBUUID = CBUUID(string:”495sdfd3-FE7D-4AE5-8FA9-9FAFD205E455″)
let maestroBrainDataCBUUID = CBUUID(string: “4953sdf3-1E4D-4BD9-BA61-23C647249616”)
class HRMViewController: UIViewController {
var sciChartSurface: SCIChartSurface?
var lineDataSeries: SCIXyDataSeries!
var scatterDataSeries: SCIXyDataSeries!
var lineRenderableSeries: SCIFastLineRenderableSeries!
var scatterRenderableSeries: SCIXyScatterRenderableSeries!
var timer: Timer?
var phase = 0.0
var i = 0
@IBOutlet weak var brainRateLabel: UILabel!
var centralManager: CBCentralManager!
var maestroPeripheral:CBPeripheral!
override func viewDidLoad() {
super.viewDidLoad()
sciChartSurface = SCIChartSurface(frame: self.view.bounds)
sciChartSurface?.autoresizingMask = [.flexibleHeight, .flexibleWidth]
sciChartSurface?.translatesAutoresizingMaskIntoConstraints = true
self.view.addSubview(sciChartSurface!)
let xAxis = SCINumericAxis()
xAxis.growBy = SCIDoubleRange(min: SCIGeneric(0.1), max: SCIGeneric(0.1))
sciChartSurface?.xAxes.add(xAxis)
let yAxis = SCINumericAxis()
yAxis.growBy = SCIDoubleRange(min: SCIGeneric(0.1), max: SCIGeneric(0.1))
sciChartSurface?.yAxes.add(yAxis)
createRenderableSeries()
addModifiers()
centralManager = CBCentralManager(delegate: self , queue: nil)
// Make the digits monospaces to avoid shifting when the numbers change
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if nil == timer{
timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: updatingDataPoints)
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if nil != timer{
timer?.invalidate()
timer = nil
}
}
func updatingDataPoints(timer:Timer){
i += 1
lineDataSeries.appendX(SCIGeneric(i), y: SCIGeneric(cos(Double(i)*0.1 + phase)))
scatterDataSeries.appendX(SCIGeneric(i), y: SCIGeneric(cos(Double(i)*0.1 + phase)))
phase += 0.01
sciChartSurface?.zoomExtents()
sciChartSurface?.invalidateElement()
}
func createDataSeries(_brainwave2:Double){
// Init line data series
lineDataSeries = SCIXyDataSeries(xType: .double, yType: .double)
lineDataSeries.fifoCapacity = 500
lineDataSeries.seriesName = “line series”
// Init scatter data series
// scatterDataSeries = SCIXyDataSeries(xType: .double, yType: .double)
// scatterDataSeries.fifoCapacity = 500
// scatterDataSeries.seriesName = “scatter series”
for i in 0...500{
lineDataSeries.appendX(SCIGeneric(i), y: SCIGeneric(_brainwave2))
// scatterDataSeries.appendX(SCIGeneric(i), y: SCIGeneric(cos(Double(i)*0.1)))
}
i = Int(lineDataSeries.count())
}
func createRenderableSeries(){
lineRenderableSeries = SCIFastLineRenderableSeries()
lineRenderableSeries.dataSeries = lineDataSeries
scatterRenderableSeries = SCIXyScatterRenderableSeries()
scatterRenderableSeries.dataSeries = scatterDataSeries
sciChartSurface?.renderableSeries.add(lineRenderableSeries)
sciChartSurface?.renderableSeries.add(scatterRenderableSeries)
}
func addModifiers(){
let xAxisDragmodifier = SCIXAxisDragModifier()
xAxisDragmodifier.dragMode = .pan
xAxisDragmodifier.clipModeX = .none
let yAxisDragmodifier = SCIYAxisDragModifier()
yAxisDragmodifier.dragMode = .pan
let extendZoomModifier = SCIZoomExtentsModifier()
let pinchZoomModifier = SCIPinchZoomModifier()
let rolloverModifier = SCIRolloverModifier()
let legend = SCILegendModifier()
let groupModifier = SCIChartModifierCollection(childModifiers: [xAxisDragmodifier, yAxisDragmodifier, pinchZoomModifier, extendZoomModifier, legend, rolloverModifier])
sciChartSurface?.chartModifiers = groupModifier
}
func brainwaveReceived(_ brainWave:Double){
let brainWave = brainWave * 3.3 / 65536
brainRateLabel.text = String(brainWave)
print(“brainwave: (brainWave)”)
}
}
extension HRMViewController: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .unknown:
print("central.state is . unknown")
case .resetting:
print("central.state is . resetting")
case .unsupported:
print("central.state is . unsupported")
case .unauthorized:
print("central.state is . unauthorized")
case .poweredOff:
print("central.state is . poweredOff")
case .poweredOn:
print("central.state is . poweredOn")
centralManager.scanForPeripherals(withServices:nil)
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print(peripheral)
if peripheral.name == “MAESTRO1” {
// maestroPeripheral = peripheral
centralManager.stopScan()
maestroPeripheral = peripheral
maestroPeripheral.delegate = self
central.connect(maestroPeripheral)
}
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print(“Connected!”)
maestroPeripheral.discoverServices([maestroServiceCBUUID])
}
}
extension HRMViewController:CBPeripheralDelegate{
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard let services = peripheral.services else {return}
for service in services {
print(service)
peripheral.discoverCharacteristics(nil, for: service)
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
guard let characteristics = service.characteristics else {return}
for characteristic in characteristics {
print(characteristic)
if characteristic.properties.contains(.read){
print("\(characteristic.uuid): properties contain .read")
}
if characteristic.properties.contains(.notify){
print("\(characteristic.uuid): properties contain .notify")
peripheral.setNotifyValue(true , for: characteristic)
}
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic,
error: Error?) {
switch characteristic.uuid {
case maestroBrainDataCBUUID:
let wave = Double(brainData(from: characteristic))*3.3/65536
createDataSeries(_brainwave2:wave)
default:
print("Unhandled Characteristic UUID: \(characteristic.uuid)")
}
}
private func brainData(from characteristic: CBCharacteristic) -> Int {
guard let characteristicData = characteristic.value else { return -1 }
let byteArray = UInt8
let firstBitValue = byteArray[0] & 0x01
if firstBitValue == 0 {
// Heart Rate Value Format is in the 2nd byte
return Int(byteArray[1])
} else {
// Heart Rate Value Format is in the 2nd and 3rd bytes
return (Int(byteArray[1]) << 8) + Int(byteArray[2])
}
}
}
- JaeHwan Seol asked 6 years ago
- last active 6 years ago
Currently we have two graph surfaces with two Y axes on each side and we need all of the Y axes to have fixed width size. Until now we were achieving that like this:
topGraphSurface.LeftAxisAreaForcedSize = 45;
topGraphSurface.RightAxisAreaForcedSize = 45;
bottomGraphSurface.LeftAxisAreaForcedSize = 45;
bottomGraphSurface.RightAxisAreaForcedSize = 45;
but since updating to the new SciChart v3 we get the error “SciChartSurface does not contain a definition for (Left)AxisAreaForcedSize”. I couldn’t find any information about this in the Migration guide, so is there a way to achieve this in the new version?
- Martina Papaliska asked 4 years ago
- last active 4 years ago
Hello,
One thing I can’t figure out is why I don’t see the axis tooltips when using SCIRolloverModifier or SCICursorModifier? If I use xAxis.axisTitleMargins = NSEdgeInsets(top: 1000, left: 0, bottom: 10, right: 0)
I can see tooltips on x axis but only until some point and from there moving the cursor to the right leads to some sort of overlay and tooltip disappears. See the photos.
Is this a bug or I’m doing something wrong?
- Tihomir Manushev asked 1 year ago
- last active 1 year ago
Hello,
I’m following along with the tutorial. I installed using the pod. I am at the end of Tutorial 3 and am getting an error. Use of unresolved Identifier ‘SciGeneric’. I can see I have the wrapper file in my project. Any Ideas what I’m doing wrong?
Thanks
Warren
- Warren Hansen asked 7 years ago
- last active 7 years ago
Hi SciChart team,
there is a working example that implement a Polar Chart type for iOS?
I was unable to find anything in the documentation. Only for WPF platform.
If not, there is a plan to support this kind of chart in next release of the library?
Thanks for the help.
- Samuele Scatena asked 4 years ago
- last active 4 years ago
I’m trying to render a column chart with multiple series. I want the two series to show side-by-side. See the reference image attachment for how I want it to look.
However, when I add a second series to a surface, the two series overlap and draw over each other, such that you can ‘t see some of the column data points.
Is there a way to draw multiple series that don’t overlap?
While I’m here, a have a couple of more questions:
• Is there a way to show more of the values on the time/date series X-axis . Notice in the SciChart column chart that is attached it shows every third value on the X-axis (Jan, April, July, October). It would be great if I could show every two, or all for each data point.
• For a time/date series X-axis, can I show a different representation of the time/date values? Specifically, I want to show, e.g.
Jan 17
rather than
01-2017
Presumably one would specify a different date formatter but I only see how to do variations of “MM-dd-yyy”. I want to show values as textual rather than numeric.
• Is there a way to extend the Y-axis to go higher?
In the SciChart column chart attachment, the Y-axis goes up to 100, but the values go higher. I would like to show the the Y-axis going up to 120.
• Is there a way to change the interval of the Y-axis?
Instead of showing every 20 values, can I show every 25 values?
Thanks.
- doughill asked 7 years ago
- last active 7 years ago
Using custom label provider I am able to format the cursor label, but still there is the name of the axis. I only want to show the value here, like “0,91” and remove the “X:” (see attached screenshots).
Thanks in advance.
override func formatCursorLabel(_ dataValue: SCIGenericType) -> String! {
return "" // super.formatCursorLabel(dataValue)
}
- Christoph Rehbichler asked 6 years ago
- last active 6 years ago
Hi, guys
I have some data series like:
[[SCIXyDataSeries alloc] initWithXType:SCIDataType_DateTime
YType:SCIDataType_Double
SeriesType:SCITypeOfDataSeries_XCategory];
Also my Y axis is kind of class SCINumericAxis
So my question is
if i’m trying add value to the series
[volumeSerie appendX:SCIGeneric(bar.time) Y:SCIGeneric([bar.volume doubleValue])];
and my bar.volume is bigger than 2 147 483 648 (float limit as i’m know). It’s leads to a axis range crash. Like on the attached image.
So what should i use to handle huge values?
Like a billions and more
Best regards,
Sushynski Andrei
- Andrei Sushynski asked 7 years ago
- last active 7 years ago
When i try to run the simple Example from the Documentation ( with my trial License Key ) :
class AppDelegate: NSResponder, NSApplicationDelegate {
override init(){
// Set this code once in AppDelegate or application startup
SCIChartSurface.setRuntimeLicenseKey(“XXXXXX”);
super.init()
}
i receive this error and the application builds but fails to start :
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception ‘License Exception’, reason: ”
terminating with uncaught exception of type NSException
- nadim massih asked 3 years ago
- last active 2 years ago
Hello
is there a way to set the padding (aka reduce the gap) between bars in a SCIFastColumnRenderableSeries?
I attach a screenshot of my current situation: I would like to have zero margin between columns.
I tried searching in the knowledge base but all the answers I found seem to refer to APIs not available in the iOS SDK
- SciChartSurface without paddings (https://www.scichart.com/questions/wpf/how-to-draw-a-pixel-x-millemeter)
- Reduce Chart Padding (https://www.scichart.com/questions/wpf/reduce-chart-padding)
.
There is not such class method in the iOS SDK called SciChartSurface.Padding
Thanks for your help
- Neybox Digital asked 5 years ago
- last active 5 years ago
I have a question about the font of the label text. When the screen is captured and enlarged, the character has an outline border. Is there a way to get rid of this border? Japanese Kanji font is used.
Thank you.
var yAxisLeft = new SCINumericAxis();
yAxisLeft.AxisTitle = syAxLeft;
yAxisLeft.AxisId = "Primary Y-Axis";
yAxisLeft.AxisAlignment = SCIAxisAlignment.Left;
yAxisLeft.TitleStyle = new SCIFontStyle(14, UIColor.Green);
yAxisLeft.TickLabelStyle = new SCIFontStyle(14, UIColor.Green);
yAxisLeft.DrawMajorBands = false;
yAxisLeft.DrawMinorGridLines = false;
- toshiaki tsuchiya asked 4 years ago
- last active 3 years ago
Hey guys,
Starting from 2.0 we can have dashed lines in renderable series. I was wondering can we have dashed line annotations as well?
I tried this:
verticalLineAnnotation.style.linePen = [[SCIPenDashed alloc] initWithColor:[UIColor redColor] width:2 withStrokeDashArray:@[@(10.f),@(3.f)]];
and got this build error:
Assigning to 'SCIPenStyle *' from incompatible type 'SCIPenDashed *'
Isn’t SCIPenDashed a SCIPenStyle?
Best,
Igor
- Igor Peric asked 7 years ago
- last active 7 years ago
In Android we are using initPlacementStrategy with HorizontalLineAnnotations to hide the axis label of annotation when the annotation is scrolled out of the view. So what is the equivalent way in iOS
- Manish Malviya asked 5 years ago
- last active 5 years ago
Hi,
I have an issue regarding to SCIAxisMarkerAnnotation that I could not find. Can I customise the look of it or should I implement my own axis marker? And can I add another pan gesture to annotation pin so the user can change annotation location on that axis?
Thanks,
Irmak
- Irmak Can Ozsut asked 7 years ago
- last active 5 years ago
i am Swift Language
let dragmodifier = SCIZoomPanModifier()
dragmodifier.clipModeY = .clipAtExtents
-OR-
How can i acheive this?
- Atiq Tahir asked 5 years ago
- last active 4 years ago
Trying to install SciChart.iOS NuGet package for Xamarin.iOS project results the following error:
Package SciChart.iOS 2.0.1.527 is not compatible with xamarinios10 (Xamarin.iOS,Version=v1.0). Package SciChart.iOS 2.0.1.527 supports: xamarinios (xamarin-ios,Version=v0.0)
Wondering what the heck is “xamarin-ios,Version=v0.0”? It must be xamarinios10. We’re considering to buy SciChart but right now our build server is stuck on this error. As a workaround, we raname xamarin-ios to xamarinios10 in the lib directory but this not an option for a cloud build server.
- rubs00 asked 7 years ago
- last active 7 years ago
I’m tested on iPhone 8 (iOS 13.5.1) and iPad (iPadOS 13.5.1). On iPad the graph always works great but on iPhone sooner or later it always fails.
The exception is always “Thread 1: EXC_BAD_ACCESS (code=1, address=0x11d927ffc)” in the application main:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); <–
}
}
in the task stack:
SciChart`XValuesProviderWrapper<int>::GetDoubleValue:
0x103b530e0 <+0>: ldr x8, [x0, #0x8]
0x103b530e4 <+4>: ldr w8, [x8, w1, sxtw #2] <--
0x103b530e8 <+8>: scvtf d0, w8
0x103b530ec <+12>: ret
The truth is, I have no idea what’s going on. .. Please, anyone know what might be happening?
Thank you very much!
Due to the app upgrade, the code is in objective-c. This is my initialization code:
- (void) loadSciChartSurface:(SCIChartSurface*)surface {
sciChartSurface = surface;
sciChartSurface.translatesAutoresizingMaskIntoConstraints = true;
// scroll
SCIZoomPanModifier *zoomPan = [SCIZoomPanModifier new];
zoomPan.receiveHandledEvents = true;
zoomPan.zoomExtentsY = false;
zoomPan.direction = SCIDirection2D_XDirection;
[sciChartSurface.chartModifiers add:zoomPan];
// zoom
SCIPinchZoomModifier *pinchZoomModifier = [SCIPinchZoomModifier new];
pinchZoomModifier.direction = SCIDirection2D_XDirection;
pinchZoomModifier.scaleFactor = 1.5;
[sciChartSurface.chartModifiers add:pinchZoomModifier];
// series
rSeries = [SCIFastLineRenderableSeries new];
xAxis = [SCINumericAxis new];
yAxis = [SCINumericAxis new];
xAxis.visibleRangeChangeListener = ^(id<ISCIAxis> axis, id<ISCIRange> oldRange, id<ISCIRange> newRange, BOOL isAnimating) {
int min = newRange.minAsDouble;
int max = newRange.maxAsDouble;
int center = (min + max) / 2;
if (center <= 0) {
axis.visibleRange.min = @(0.0 - xHalfWidth);
axis.visibleRange.max = @(xWidth - xHalfWidth);
} else if (center >= dataSamples) {
axis.visibleRange.min = @(dataSamples - xHalfWidth);
axis.visibleRange.max = @(dataSamples + xHalfWidth);
} else {
// xWith is updated to keep the zoom factor in limits, when (center <= 0) or (center >= dataSamples)
xWidth = max - min;
xHalfWidth = xWidth / 2;
}
};
[SCIUpdateSuspender usingWithSuspendable:sciChartSurface withBlock:^{
[sciChartSurface.xAxes add:xAxis];
[sciChartSurface.yAxes add:yAxis];
[sciChartSurface.renderableSeries add:rSeries];
[SCIAnimations sweepSeries:rSeries duration:0.0 andEasingFunction:[SCICubicEase new]];
}];
dataSeries = [[SCIXyDataSeries alloc] initWithXType:SCIDataType_Int yType:SCIDataType_Short];
// x
xWidth = theFileFormat.mSampleRate * MIN_SECONDS_IN_GRID * 1;
xIndex = 0;
xHalfWidth = xWidth / 2;
xAxis.visibleRange = [[SCIDoubleRange alloc] initWithMin:0.0 max:xWidth];
// y
yAxis.visibleRange = [[SCIDoubleRange alloc] initWithMin:SHRT_MIN max:SHRT_MAX];
[self loadDefaultStyle];
}
- Vicente Broseta asked 4 years ago
- last active 4 years ago
Stacked Bar chat: If we give 0 values, there are Black lines showing at middle of screen. please see attached screen.
- Nathaniel Thomas asked 4 years ago
- last active 4 years ago
Good day!
I need to determine the value of the visible graph y from the x value and the problem is that I can’t calculate the y value outside of the data I’m rendering
example data:
[
{ x:1, y: 10 },
{ x:5, y: -5 },
{ x: 9, y: 15}
]
I use SCISplineMountainRenderableSeries and I need to show the intersection of the graph at point 3.5
I need a point but I have only one coordinate value
how can i get this y value?
- Sergey Evdokimov asked 2 years ago
- last active 2 years ago
iPhone 6, OS 12.4.3., X-axis, Y-axis texts are shown in inverted text. We can see this issue if we download the AppStore version of SciChart app
- Nathaniel Thomas asked 4 years ago
- last active 4 years ago
Hello there,
I am new to SciChart and trying to implement custom SCICursorModifiers tooltip,
It’s almost done, except one issue, i.e I am not able to hide the X axis (or) Horizontal line which is in green colour, it is showing up in the background whenever I am trying to use the tooltip.
The line which needs to be hidden
I tried with following below code but it is not working
extension SCIChartTheme {
static let berryBlue: SCIChartTheme = SCIChartTheme(rawValue: "SciChart_SciChartv4DarkStyle")
}
SCIThemeManager.addTheme(.berryBlue, from: Bundle.main)
Is there any way to achieve this
Thanks in Advance
- Steven Deshazer asked 10 months ago
- last active 10 months ago
I have a simple line renderable series in iOS with an SCIDateTimeAxis for X and an SCINumericAxis for Y. At this point all I’m trying to do is format the Y-axis labels and cursor labels as currency. According to the documentation, this should be as simple as:
yAxis.textFormatting = "$%f"
But it does not appear to properly use this formatting. The Y-axis is showing values like “$%f1400” when formatting a value for 14.
So, I instead attempted creating my own label provider by overriding SCINumericLabelProvider:
class CurrencyLabelProvider: SCINumericLabelProvider {
static let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
return formatter
}()
override func formatLabel(_ dataValue: SCIGenericType) -> NSAttributedString! {
let value = dataValue.doubleData
let string = CurrencyLabelProvider.formatter.string(from: NSNumber(value: value))!
return NSAttributedString(string: string)
}
}
Then assigning:
yAxis.labelProvider = CurrencyLabelProvider()
This works to properly format the axis labels. So, I also override SCINumericLabelProvider to provide the cursor labels:
override func formatCursorLabel(_ dataValue: SCIGenericType) -> NSAttributedString! {
let value = dataValue.doubleData
let string = CurrencyLabelFormatter.formatter.string(from: NSNumber(value: value))!
return NSAttributedString(string: string)
}
This then properly formats the cursor label for the Y-axis- but it also formats the X-axis cursor:
At this point, the X-axis is already assigned an SCIDateTimeLabelProvider- the X-axis is not assigned CurrencyLabelProvider. But it seems to be overridden by the Y-axis label provider or simply unused. The X-axis labels are formatted as dates properly, but X-axis cursor values are just numbers when not being interfered with by the Y-axis label provider.
Am I misunderstanding something or are these all bugs in the iOS SDK? We’re currently evaluating whether this package will meet our needs and it certainly appears to be riddled with issues.
- Sean Young asked 5 years ago
- last active 5 years ago
Dear SCICharts support:
We have a very large project that must be migrated to version 3 because right it uses version 2.
I am stuck in the following issues:
1/ I cannot convert Double or Date to ISCIComparable.
Our x axis contains Date-timestamp values and I am trying to find the index of the dataseries.xValues of a specific Date having as parameter my Date value which is Date type and not ISCIComparable.
How can I do this ?
When I try my attempt 1:
let x: Double = <DoubleValue>
let index = dataSeries.xValues.findIndex(of: x, searchMode: .nearest, isSorted: true)
I am getting the build error: “Cannot convert value of type ‘Date?’ to expected argument type ‘ISCIComparable?'”
When I try my attempt 2:
If I also try to iterate the xValues and find the ISCIComparable value which has doubleValue equal the x then I get the error “Type ‘ISCIList?’ does not conform to protocol ‘Sequence'”
I mean something like this:
let x: Date = Date()
var comparableValue: ISCIComparable? = nil
for val in dataSeries.xValues {
if val.toDate() == x {
comparableValue = val
}
}
So any solution please ?
2/ I am trying to update the last point of dataSeries using this code:
let lastPoint = dataSeries.count - 1
if let open = dataSeries.openValues.value(at: lastPoint) {
dataSeries.update( open: open,
high: max(dataSeries.highValues().value(at: lastPoint).toDouble(), mbidPrice),
low: min(dataSeries.lowValues().value(at: lastPoint).toDouble(), mbidPrice),
close: mbidPrice,
at: lastPoint) }
and I get the error “Cannot convert value of type ‘ISCIComparable’ to expected argument type ‘ISCIValues?’ “
Why ? How should I do this ?
Thanks a lot in advance
- Dxat asked 4 years ago
- last active 4 years ago
Hi,
I’m trying to convert Java code to swift and I need the AnnotationLabel’s setAxisLabelStyle equivalent.
AnnotationLabel annotationLabel = new AnnotationLabel(getContext());
annotationLabel.setLabelPlacement(LabelPlacement.Axis);
annotationLabel.setAxisLabelStyle(new Action1<AnnotationLabel>()
{
@Override
public void execute(AnnotationLabel annotationLabel)
{
annotationLabel.setFontStyle(new FontStyle(37.0f, Color.BLUE));
annotationLabel.setBackgroundResource(R.drawable.current_price);
}
});
How can i apply this code in swift?
- Emre Gökberk asked 4 years ago
- last active 4 years ago