Charts: ์œ„์น˜์˜ ๊ธฐ๋ณธ ํ™•๋Œ€/์ถ•์†Œ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 08์›” 04์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: danielgindi/Charts

์šฐ์„  ํ›Œ๋ฅญํ•œ ๋„์„œ๊ด€์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” ๋นจ๋ฆฌ ์ฐพ์•˜์œผ๋ฉด ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๊บพ์€์„ ํ˜• ์ฐจํŠธ ๋˜๋Š” ๋ง‰๋Œ€ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์„ค์ •์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ฐจํŠธ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ์ด๋Ÿฌํ•œ 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ๋ชจ๋‘ ํ‘œ์‹œํ•˜๋Š” ๋Œ€์‹  ๋งˆ์ง€๋ง‰ 10๊ฐœ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋˜๋Š” ์ฒ˜์Œ 10๊ฐœ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž๋Š” ๋‚˜๋จธ์ง€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Thnx

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@spauldingim ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ๋•Œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ํ™•๋Œ€๋˜๋Š” ๋ง‰๋Œ€ ์ฐจํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งค๋ฒˆ ๋จผ์ € ์ถ•์†Œํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
barChartView.zoom(scaleX: 0, scaleY: 0, x: 0, y: 0)

๋ชจ๋“  8 ๋Œ“๊ธ€

์ œ ์˜ˆ์ „ ๊ธ€๊ณผ ๋น„์Šทํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์€ ์ฐจํŠธ๋ฅผ ๋’ค๋กœ ์ ํ”„ํ•˜๋ฉด์„œ ์Šค์ผ€์ผ/์Šคํฌ๋กค ์˜คํ”„์…‹ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/danielgindi/ios-charts/issues/226

๋น ๋ฅธ ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ „์— ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด์•˜์ง€๋งŒ ์›ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ์„ค์ •ํ•ด์•ผ ํ• ์ง€ ์—ฌ์ „ํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 1๊ฐœ์˜ VC๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ VC๋ฅผ ์ด์›”ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํฌ๊ฒŒ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž˜์€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์•„์ฃผ ๋นจ๋ฆฌ ํ•ด๊ฒฐ์ฑ…์„ ๋‚ด๋†“๊ธฐ๋ž€ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์ด๋ผ๋ฉด ๋จผ์ € panGestureRecognized ๋ฐ pinchGestureRecognized ๋ฅผ ๋ณด๊ณ  ํ™•๋Œ€/์ถ•์†Œ/์Šคํฌ๋กค์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ„ฐ์น˜ ์œ„์น˜์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์Šค์ผ€์ผ/๋ณ€ํ™˜ ๊ฐ’์„ ์–ป๊ณ  CGAffineTransform ํ•˜๊ณ  viewPortHandler.refresh() ๋ฅผ ํ†ตํ•ด ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์ƒˆ๋กœ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ChartTransformer ๋ฐ ChartViewPortHandler ์—๋Š” ๋งŽ์€ API๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ํ™”๋ฉด ํ”ฝ์…€์„ ์„œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ผ ๋ ˆ๋ฒจ์ด ์ฃผ์–ด์ง€๋ฉด ์ฒ˜์Œ/๋งˆ์ง€๋ง‰ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋ณ€ํ™˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์œจ ์ˆ˜์ค€์ด ์ฃผ์–ด์ง„ ํŠน์ • ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. viewPortHandler.contentRect์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จํ•˜๋„๋ก ๊ณ„์‚ฐ์„ ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค(์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ x ๊ฐ’์„ ํ†ตํ•ด). ๊ทธ๋Ÿฌ๋ฉด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„์™€ ์˜คํ”„์…‹, ๊ทธ๋ฆฌ๊ณ  ํ–‰๋ ฌ์„ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋‹ต๋ณ€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค:) ์ž ์‹œ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ž‘์—…์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ†ตํ•ด ํ–‰๋ ฌ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

self._viewPortHandler.restrainViewPort(offsetLeft: left, offsetTop: top, offsetRight: right, offsetBottom: bottom)
prepareOffsetMatrix()
prepareValuePxMatrix()

์กฐ๊ธˆ ๊ฐ€์ง€๊ณ  ๋†€๋‹ค๊ฐ€ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ฝค ์ง์„ค์ ์ž…๋‹ˆ๋‹ค.

chart.data = data;   // This is the MAIN reason, data for the chart has to be set first before the next 2 steps otherwise they will just get ignored like nothing has been set.

// ์ตœ๋Œ€ x ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ 10์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์—์„œ ๊บพ์€์„ ํ˜• ๋˜๋Š” ๋ง‰๋Œ€ ์ฐจํŠธ์— ๋Œ€ํ•ด 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋งŒ ํ‘œ์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
[์ฐจํŠธ setVisibleXRan geMaximum:10 ];
// ์ฐจํŠธ ๋ทฐ๋ฅผ ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๋งˆ์ง€๋ง‰ 10๊ฐœ ํ•ญ๋ชฉ์ธ X์˜ 90๊ฐœ ์ธ๋ฑ์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
[์ฐจํŠธ ์ด๋™ ViewToX:90 ];

์ข‹์€ ์บ์น˜!

10๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋งŒ ํ‘œ์‹œํ•˜๋„๋ก ๋ณด๊ธฐ๋ฅผ '์ž ๊ทธ'๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด viewDidLoad์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
float xScale = totalPoints / initialPointsDisplayed;
[์ฐจํŠธ ์คŒ:xScale scaleY:1.0 x:0.0 y:0.0];
[self.chartView ์ด๋™ veViewToX:totalPoints - initialPointsDisplayed];

@spauldingim ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ๋•Œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ํ™•๋Œ€๋˜๋Š” ๋ง‰๋Œ€ ์ฐจํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์„ค์ •ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งค๋ฒˆ ๋จผ์ € ์ถ•์†Œํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
barChartView.zoom(scaleX: 0, scaleY: 0, x: 0, y: 0)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰