Charts: ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋™์•ˆ ๋ฐ ๋“œ๋ž˜๊ทธ ํ•œ ํ›„์— ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€๋Š” ๋ง‰๋Œ€

์— ๋งŒ๋“  2017๋…„ 03์›” 13์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: danielgindi/Charts

BarChartView ์‚ฌ์šฉํ•˜์—ฌ ๋ง‰๋Œ€ ์ฐจํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ์—๋Š” ํ•˜๋ฃจ์— ์ž‘์—… ์‹œ๊ฐ„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์•ˆํƒ€๊น๊ฒŒ๋„ ์ผ๋ถ€ ๋ง‰๋Œ€๋Š” ์ „ํ˜€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ง‰๋Œ€๋Š” ์ „์ฒด ์ฐจํŠธ๋ฅผ ๋„๋Š” ๋™์•ˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ฐจํŠธ๊ฐ€ ์ฒ˜์Œ ํ‘œ์‹œ๋˜๊ธฐ ์ „์— ํ•œ ๋ฒˆ์— 7 ๊ฐœ์˜ ๋ง‰๋Œ€ ๋งŒ ํ‘œ์‹œ๋˜๋„๋ก ํ™•๋Œ€ / ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

barChart.zoom(scaleX:ceil(CGFloat(dataSet.xMax - dataSet.xMin) / 7), scaleY: 1, x: 0, y: 0)

๊ทธ๋Ÿฐ ๋‹ค์Œ๋ณด๊ธฐ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋ฏ€๋กœ ์ตœ๊ทผ ๋‚ ์งœ๊ฐ€ ๋จผ์ € ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

barChart.moveViewToAnimated(xValue: dataSet.xMax, yValue: dataSet.yMin, axis: barChart.rightAxis.axisDependency, duration: 0.8, easingOption: .easeInOutSine)

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

img_2071

์ฐจํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜์ž๋งˆ์ž ๋ง‰๋Œ€๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (Mo. 6 ์ผ ๋ง‰๋Œ€๋Š” ์‚ฌ๋ผ์ง).

img_2072

๋˜ํ•œ ๋” ์™ผ์ชฝ์— ์žˆ์œผ๋ฏ€๋กœ (ํ™•๋Œ€ / ์ถ•์†Œ๋กœ ์ธํ•ด) ์ฆ‰์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ง‰๋Œ€๋Š” ์ „ํ˜€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ˆ?

help wanted โ˜…โ˜…

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

๋ˆ„์  ๋ง‰๋Œ€ BarChartData() ๊ฐ€์žˆ๋Š” CombinedChartView ์—์„œ 3.0.2์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‘œ์‹œ๋˜๋Š”๋ณด๊ธฐ ์™ธ๋ถ€์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ํ™•๋Œ€ / ์ถ•์†Œํ•˜๊ณ  ๋Œ๋ฉด ๋ง‰๋Œ€๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ๋ฐ์ดํ„ฐ ๋ ˆ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” .setVisibleXRangeMaximum() ์ œํ•œํ•˜๊ฑฐ๋‚˜ .moveViewToX() ๋ฅผ ํ†ตํ•ด ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด์ƒํ•œ ๋™์ž‘์€ .highlightPerTapEnabled() ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ง‰๋Œ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด 13 ์„ธํŠธ์˜ ์ค‘์•™ ๋ง‰๋Œ€ ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ „ํ˜€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ : ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ์—ญ์ˆœ์œผ๋กœ ์ž…๋ ฅ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. x ๊ฐ’์„ ๋Š˜๋ ค ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ์ •๋ ฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋จผ์ € ๋‹น์‹  ์ชฝ์—์„œ ๋””๋ฒ„๊ทธ๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
barRect๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.
ํ™•๋Œ€ / ์ถ•์†Œ ์ „ํ›„์— barRect๊ฐ€ ๋ˆ„๋ฝ ๋œ ์›์ธ์„ ๋””๋ฒ„๊น…ํ•˜์‹ญ์‹œ์˜ค.
์ผ๋ถ€ ๋ง‰๋Œ€๊ฐ€ ์•„์ง ์žˆ๊ณ  ๋ ˆ์ด๋ธ” ์œ„์น˜๊ฐ€ ์ •ํ™• ํ•ด ๋ณด์ธ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ๋„์„œ๊ด€์ด๋‚˜ ์‚ฌ์šฉ์ž์˜ ๊ฐ„๋‹จํ•œ ์‹ค์ˆ˜ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ChartsDemo๋กœ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฅผ ๋งŒ๋“ค ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์‹ค์ œ๋กœ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด Xcode 8.2.1 ์˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ iPhone 6 (10.2) ์—์„œ ๋Œ€์ƒ ChartsDemo ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฐจํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด Tue 7th ์˜ ๋…น์ƒ‰ ๋ง‰๋Œ€๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ• ๋งŒํ•œ ์  : ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฝ”๋“œ๋Š” ์†์„ฑ ์ฐจํŠธ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ์ด ํ’€ ์š”์ฒญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ

๋น ๋ฅธ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ ๋ชจ๋‘ ๋ˆ„๋ฝ ๋œ ๋ง‰๋Œ€๊ฐ€ ์ค‘๋‹จ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

ํ•˜์ง€๋งŒ ์›์ธ์„ ์„ค๋ช… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. barRect 'seem'์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌ!

ํ’€ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹ค์‹œ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ์ถ• ๋ ˆ์ด๋ธ”์ด ๊ทธ๋ ค์ง€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ถ• ํ•ญ๋ชฉ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๊ฒฐ๊ตญ barRect์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ a) ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์˜ ๋ฒ„๊ทธ b) ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„๊ทธ ๋˜๋Š” c) ๋‹จ์ˆœํžˆ ์ž˜๋ชป๋œ ์‚ฌ์šฉ ๋•Œ๋ฌธ์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ master๋กœ ๊ต์ฒดํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ต์ฒดํ•˜๊ณ  ์žฌํ™•์ธ์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

viewPortHandler.isInBoundsRight ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ barRect ๊ณ„์‚ฐ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. contentRect ๋ฐ bar rect edge ๋ฌธ์ œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ๊ฐํ˜• ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์‚ดํŽด๋ณผ ์‹œ๊ฐ„์ด๋ณ„๋กœ ์—†์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ChartsDemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@danielgindi ์–ด๋–ค ์•„์ด๋””์–ด?

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๋‚˜์ด ๋ฌธ์ œ์— ๊ด€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋ฌด๊ฒƒ๋„? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@marbetschar ์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•ด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ฅผ ๊ธฐ์–ตํ•˜๋ฉฐ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ PR๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ดํŽด๋ณผ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์ ์ธ ๋ฌธ์ œ๋Š” ์™œ ๊ทธ๊ฒƒ์ด ์กฐ๊ฑด์„ ๋„˜์–ด์„œ๋Š”์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. bar rect๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋™์•ˆ ๋ช…๋ฐฑํ•œ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์žˆ์œผ๋ฉด barRect ๊ณ„์‚ฐ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด, ๋ง‰๋Œ€๊ฐ€ ์—†์–ด๋„ ๊ทธ ์œ„์˜ ๋ ˆ์ด๋ธ”์€ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ barRect ๊ฐ€์žฅ์ž๋ฆฌ ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๊ฑฐ๋ฅผ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

๋ง‰๋Œ€๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์™€ ํฌ๊ธฐ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ฐ€์žฅ์ž๋ฆฌ ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@marbetschar ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

@jeffalee ์•ˆํƒ€๊น๊ฒŒ๋„ ์•„์ง์ด ๋ฌธ์ œ๋ฅผ

@marbetschar @jeffalee ์ด ๋ฌธ์ œ๋Š” viewPortHandler์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

3.0.2์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

self.chartView.data = getChartData() // .count == 25
self.chartView.setVisibleXRangeMaximum(10) 
self.chartView.moveViewToX(20)

์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์Šคํฌ๋กคํ•˜๋ฉด ๋งˆ์ง€๋ง‰ 10 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ง‰๋Œ€ ๋งŒ ๋ Œ๋”๋ง / ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ๋งˆ์ง€๋ง‰ ๋ง‰๋Œ€๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋ง‰๋Œ€ ๊ฐ’์ด ํŽ˜์ด๋“œ ์•„์›ƒ๋˜๊ณ 
  • ๋งˆ์ง€๋ง‰์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๊ทธ๋ ค์ง„ ๋ง‰๋Œ€๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.
  • xAxis ๋ ˆ์ด๋ธ”์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋‘ ์ค„์„ ์ œ๊ฑฐํ•˜๋ฉด ์ฐจํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

@perwyl ๋‚ด ์ฝ”๋“œ์— ๋˜‘๊ฐ™์€ ๋‘ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฐ™์€ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. @ liuxuan30 ์€ ์•ฝ๊ฐ„ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ viewPortHandler ์™€ ๊ด€๋ จ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ํ˜„์žฌ ์ด๊ฒƒ์„ ํŒŒํ—ค์น  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@marbetschar ์ข‹์•„. ํ™•์ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„์  ๋ง‰๋Œ€ BarChartData() ๊ฐ€์žˆ๋Š” CombinedChartView ์—์„œ 3.0.2์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‘œ์‹œ๋˜๋Š”๋ณด๊ธฐ ์™ธ๋ถ€์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ํ™•๋Œ€ / ์ถ•์†Œํ•˜๊ณ  ๋Œ๋ฉด ๋ง‰๋Œ€๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ๋ฐ์ดํ„ฐ ๋ ˆ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” .setVisibleXRangeMaximum() ์ œํ•œํ•˜๊ฑฐ๋‚˜ .moveViewToX() ๋ฅผ ํ†ตํ•ด ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด์ƒํ•œ ๋™์ž‘์€ .highlightPerTapEnabled() ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ง‰๋Œ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด 13 ์„ธํŠธ์˜ ์ค‘์•™ ๋ง‰๋Œ€ ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ „ํ˜€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ : ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ์—ญ์ˆœ์œผ๋กœ ์ž…๋ ฅ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. x ๊ฐ’์„ ๋Š˜๋ ค ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ์ •๋ ฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@kscheff ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ? ๋„ˆ์˜ ๊ฒƒ๋งŒ ์•„๋‹ˆ๋ฉด @marbetschar ๋„?

@ liuxuan30 @marbetschar ๊ทธ์˜ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์ •๋ ฌํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ˆ„๋ฝ ๋œ ๋ง‰๋Œ€์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @marbetschar ์—๊ฒŒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ํ•ญ๋ชฉ์„ ์ •๋ ฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@kscheff ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ

 Another strange behavior is that I cannot select all bars via .highlightPerTapEnabled(), only the center bar in a set of e.g. 13 is selectable. Not sure if this is related at all.

@perwyl ์ด ๋ฌธ์ œ๋Š” ์ •๋ ฌ๊ณผ ํ•จ๊ป˜ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

@kscheff ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์‹ค์ œ๋กœ return yVals.reversed() ํ•  ํ•„์š”๊ฐ€์žˆ๋‹ค. ์ด๊ฒƒ ๋’ค์—์žˆ๋Š” ๋…ผ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋ฉด ํ™•๋Œ€ / ์ถ•์†Œํ•˜๋ฉด์„œ ์ฐจํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋œ๋‹ค๋Š” ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ ์ž‘์—…์ด ๊ธฐ๋ณธ์ ์œผ๋กœ "notifyDataSetChanged"๋ฉ”์„œ๋“œ์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์œ„์น˜์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? PR์„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทผ๋ณธ ์›์ธ ๋“ฑ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ PR์„ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋Œ€ํ™” ์˜€์ง€๋งŒ์ด ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด (๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ •๋ ฌ ๋œ ๋ฐฉ์‹์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •๋ ฌ ๋˜๋Š”์ด ๋ฌธ์ œ? ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ ฌ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ ๋˜๋Š”์ด ๋ฌธ์ œ? ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ ฌ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€๋ณด๊ธฐ์— ์ฐจํŠธ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ž˜๋ชป๋œ ํ‘œํ˜„์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ์ •๋ ฌ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (x ๊ฐ’์ด ์žˆ์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ทธ๋ฆฌ๋Š” ๋ฐ ํ•„์š”ํ•˜๊ณ  ์ถฉ๋ถ„ํ•œ ์กฐ๊ฑด์ด ์ •์˜ ๋จ). ๊ทธ๋ ‡๋‹ค๋ฉด ํฌ๋“œ๋Š” ์ž๊ธ‰ ์ž์กฑํ•˜๊ณ  ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์•„์•ผํ• ๊นŒ์š”? IMHO
๋‚˜๋Š” ๋ฉฐ์น  ์•ˆ์— PR์„ ์ค€๋น„ ํ•  ๊ฒƒ์ด๋‹ค.์ด ๋…ผ๋ฆฌ๊ฐ€ ๋ถ„๋ช…ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

๋ง‰๋Œ€ ์ฐจํŠธ๋กœ๋งŒ ์ž‘์—…ํ•˜์ง€๋งŒ. ์ผ๋ถ€ ์œ ํ˜•์˜ ์ฐจํŠธ๊ฐ€ ์˜ํ–ฅ์„๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋จผ์ € ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋…ผ๋ฆฌ์  ๊ด€์ ์—์„œ ์ฐจํŠธ์˜ ํ™•๋Œ€ ๋œ ๋ถ€๋ถ„์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ liuxuan30 ๋‚ด ์ดํ•ด๋Š”์ด ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ ์ถ”์ธกํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ Œ๋”๋ง์—์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ€์ •์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์š”. ๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ดํŽด๋ณธ ๊ฒƒ์€

if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

๋‘ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ถฉ์กฑ๋˜์ง€ ์•Š์•„ ๋ง‰๋Œ€๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @marbetschar ๋Š” ๊ทธ ์ดํ›„๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์›๋ž˜ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์ด @kscheff๊ฐ€ ์ œ๊ณต ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ •๋ ฌ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–˜๋“ค ์•„! ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฒ„์ „ 3.3.0์„ ์‚ฌ์šฉํ•˜๊ณ  BarChartView์—์„œ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. yAxis ๊ฐ’์„ ์ •๋ ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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