์๋ ํ์ธ์ Foma ๐ป ์ ๋๋ค!
์ค๋์ ์ํ๋ ๋ชจ์์ ์ง์ ๊ทธ๋ฆด ์ ์๋ UIBezierPath์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์์ ๋ถํฐ ๋ค๋ฃจ๊ณ ์ถ์ ์ฃผ์ ์๋๋ฐ ๋๋์ด ์ ๋ฆฌํ๊ฒ ๋๋ค์..!
๋ฐ๋ก ์์ํ ๊ฒ์~
UIBezierPath๋?
UIBezierPath๋ UIKit์์ ๊ทธ๋ฆฌ๊ธฐ(Drawing)์ ์ํด์๋ ํด๋์ค์ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด๋ค ๊ฒ์ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค์ด ์ํด์๊ฒ ์ฃ ?
์ ํ ๊ณต์ ๋ฌธ์์๋ ์๋์ ๊ฐ์ด ์ ์ํ๊ณ ์์ต๋๋ค.
A path that consists of straight and curved line segments that you can render in your custom views.
ํด์ํ๋ฉด view์์ ๋ ๋๋ง ํ ์ ์๋ ์ง์ ๊ณผ ๊ณก์ ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ๋ก๋ผ๊ณ ํ๋ค์.
Initializer
BezierPath๋ฅผ ๋งจ ์ฒ์ ์ด๊ธฐํ ํ๋ ๊ฒ ์ฆ, BezierPath๋ฅผ ์์ฑํ๋ ๋ฒ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ์.
๊ทธ๋ฆฌ๊ธฐ ์ํ UIView BezierView๋ฅผ ๋ง๋ค๊ณ BezierViewController์์ ๋ชจ์์ ํ์ธํ๊ฒ ์ต๋๋ค.
BezierView
class BezierView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
//์ด ๊ณณ์์ ๊ทธ๋ฆฌ๊ธฐ๊ฐ ์งํ๋ฉ๋๋ค.
}
}
BezierViewController
class BezierViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let bezierView:BezierView = BezierView(frame:view.frame)
bezierView.backgroundColor = .clear
view.addSubview(bezierView)
}
}
1. ์ฌ๊ฐํ
๊ฐ์ฅ ๋จผ์ ๊ธฐ๋ณธ์ด ๋๋ ์ฌ๊ฐํ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ณณ์์ UIBezierPath(rect:)๋ก ์ฌ๊ฐํ ๊ฒฝ๋ก๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
override func draw(_ rect: CGRect) {
let path = UIBezierPath(rect: CGRect(x: bounds.midX-50, y:bounds.midY-50, width: 100, height: 100))
UIColor.systemRed.setFill()
UIColor.systemYellow.setStroke()
path.lineWidth = 10
path.stroke()
path.fill()
}
์๋์ ๊ฐ์ด ์ฌ๊ฐํ ๋ชจ์์ด ๊ทธ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
2. ํ์ํ
๊ทธ ๋ค์์ผ๋ก ํ์ํ ๊ฒฝ๋ก๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
UIBezierPath(ovalIn:)์ผ๋ก ํ์ํ ๊ฒฝ๋ก๋ฅผ ์์ฑํด ์ค๋๋ค.
(draw ๋ถ๋ถ์ ๋๋จธ์ง๋ ๊ฐ์ผ๋ฏ๋ก ์๋ตํ๊ฒ ์ต๋๋ค.)
let path = UIBezierPath(ovalIn: CGRect(x: bounds.midX-50, y:bounds.midY-50, width: 100, height: 200))
์๋์ ๊ฐ์ด ํ์ํ ๋ชจ์์ด ๊ทธ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
3. ๋ฅ๊ทผ ์ฌ๊ฐํ
๋ค์์ผ๋ก ๋ ๋ชจ์๋ฆฌ๊ฐ ๋ฅ๊ธ๊ฒ ๋ผ์ด๋ฉ ์ฒ๋ฆฌ๋ ์ฌ๊ฐํ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
UIBezierPath(roundedRect:,cornerRadius:)์ผ๋ก Rect์ ์ผ๋งํผ ๋ฅ๊ธ๊ฒ ํ ๊ฑด์ง cornerRadius๋ฅผ ์ง์ ํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
let path = UIBezierPath(roundedRect: CGRect(x: bounds.midX-50, y:bounds.midY-50, width: 100, height: 200),cornerRadius: 20)
์๋์ ๊ฐ์ด ๋ชจ์๋ฆฌ๊ฐ ๋ฅ๊ทผ ์ฌ๊ฐํ์ ๋ณผ ์ ์์ต๋๋ค.
4. ํน์ ๋ถ๋ถ๋ง ๋ฅ๊ทผ ์ฌ๊ฐํ
์์์๋ ๋ชจ๋ ๋ชจ์๋ฆฌ๊ฐ ๋ฅ๊ทผ ์ฌ๊ฐํ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ์.
UIBezierPath(roundedRect:,byRoundingCorners:,cornerRadii:)๋ฅผ ํตํด์ ์ด๋ ๋ถ๋ถ์ ์ด๋ ์ ๋๋ก ๋ฅ๊ธ๊ฒ ํ ๊ฑด์ง ์ง์ ํ๊ณ ์์ฑํ ์ ์์ต๋๋ค.
let path = UIBezierPath(roundedRect: CGRect(x: bounds.midX-50, y:bounds.midY-50, width: 100, height: 200),
byRoundingCorners: [UIRectCorner.topRight, UIRectCorner.topLeft],
cornerRadii: CGSize(width: 20, height: 20))
5. ์์ ํธ
์์ ๊ฐ๋์ ๋ ๊ฐ๋๋ฅผ ์ด์ฉํ์ฌ ์์ ํธ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
UIBezierPath(arcCenter:,radius:,startAngle:,endAngle:,clockwise:)๋ฅผ ์ด์ฉํ์ฌ ์์ ์ค์ฌ๊ณผ ๋ฐ์ง๋ฆ์ ์ ํด์ฃผ๊ณ ์์ ๊ฐ๋์ ๋ ๊ฐ๋๋ฅผ ์ ํด์ฃผ๊ณ ์๊ณ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ฆด๊ฑด์ง ์ฌ๋ถ๋ฅผ ์ง์ ํด์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
let path = UIBezierPath(arcCenter:center,
radius: 50,
startAngle: 0,
endAngle: CGFloat.pi,
clockwise: true)
์๋์ ๊ฐ์ด ์๋ฐ ๋ชจ์์ด ๊ทธ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
Constructing a Path(๊ฒฝ๋ก ๊ตฌ์ฑํ๊ธฐ)
์์ ๊ฐ์ด ์ด๋ฏธ ์ฃผ์ด์ง ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ๋ชจ์์ ๊ทธ๋ฆด ์๋ ์์ง๋ง ์ง์ ์ํ๋ ๋ชจ์์ ํ๋ ํ๋ ๊ทธ๋ ค์ ํํํ ์ ์์ต๋๋ค.
ํฌ๊ฒ๋ ์ง์ ์ ์ถ๊ฐํ๊ณ , ๊ณก์ ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. ์์ ์ง์ ์ ํ๊ธฐ
๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๊ฐ์ฅ ๋จผ์ ์ด๋ ์ง์ ์์ ์์ํ ๊ฒ์ธ์ง๋ฅผ ์ ํด์ค์ผ ํ๋๋ฐ์.
move(to:)๋ฅผ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ง์ ํ ์ ์์ต๋๋ค.
๋จผ์ ๋น UIBezierPath๋ฅผ ์์ฑํด์ค ๋ค UIView์ ๊ฐ์ด๋ฐ๋ฅผ ์์์ ์ผ๋ก ์ง์ ํด์ค๋๋ค.
let path = UIBezierPath()
path.move(to: center)
2. ์ง์ ์ถ๊ฐํ๊ธฐ
addLine(to:)์ ๋์ฐฉ ์ง์ ์ ์ ํด์ฃผ๋ฉด ํน์ ์ง์ ๋ถํฐ ์ํ๋ ์ง์ ๊น์ง ์ง์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ํน์ ์ง์ ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ๊ตฌ์ฑ๋ ๊ฒฝ๋ก์ ๋๋ถํฐ ์์๋ฉ๋๋ค.
x์ถ์ 100๋งํผ ์ด๋ํ ์ง์ ์ ๊ทธ๋ ค์ฃผ๊ฒ ์ต๋๋ค.
let path = UIBezierPath()
path.move(to: center)
path.addLine(to: CGPoint(x:center.x + 100, y: center.y))
์๋์ ๊ฐ์ด ์ง์ ์ด ๊ทธ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
3. ๊ณก์ ์ถ๊ฐํ๊ธฐ(3์ฐจ ๋ฒ ์ง์ด ๊ณก์ )
addCurve(to:,controlPoint1,controlPoint2:) ์ผ๋ก 3์ฐจ ๋ฒ ์ง์ด ๊ณก์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
UIBezierPath ์ด๋ฆ ์์ฒด๊ฐ ๋ฒ ์ง์ดํจ์ค์ธ๋งํผ ์ด ๋ฉ์๋๊ฐ ํต์ฌ์ด๋ผ๊ณ ์๊ฐ๋๋๋ฐ์.
* Bezier Curve๋ ํ๋์ค์ ์๋์ฐจ ์ ์กฐ์ฌ ๋ฅด๋ ธ์ฌ์ ๊ธฐ์ ์์ธ ํผ์๋ฅด ๋ฒ ์ง์๊ฐ 1962๋ ์๋์ฐจ ๋ชธ์ฒด ๋์์ธ์ ์ฌ์ฉํ๋ฉด์๋ถํฐ ๋๋ฆฌ ์๋ ค์ก์ผ๋ฉฐ controlPoint๋ฅผ ์ด์ฉํด์ ์๋์ ๊ฐ์ ๊ณก์ ์ ์๋ฏธํฉ๋๋ค.
์ง์ ์ ๋๋ถํฐ ์๋๋ก ๋ S์ํ ๊ณก์ ์ ๊ทธ๋ ค์ฃผ๊ฒ ์ต๋๋ค.
path.move(to: center)
path.addLine(to: CGPoint(x:center.x + 100, y: center.y))
path.addCurve(to: CGPoint(x:center.x + 100, y: center.y+100),
controlPoint1: CGPoint(x:center.x + 50, y: center.y+25),
controlPoint2: CGPoint(x:center.x + 150, y: center.y+75))
์๋์ ๊ฐ์ด S์ํ ๊ณก์ ์ด ๊ทธ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
4. ๊ณก์ ๊ทธ๋ฆฌ๊ธฐ(2์ฐจ ๋ฒ ์ง์ด ๊ณก์ )
์์์ ์ปจํธ๋กค ํฌ์ธํธ๊ฐ 2๊ฐ์ธ 3์ฐจ ๋ฒ ์ง์ด ๊ณก์ ์ ๊ทธ๋ ค์ฃผ์๋ค๋ฉด ์ด๋ฒ์ ์ปจํธ๋กค ํฌ์ธํธ๊ฐ ํ๋์ธ 2์ฐจ ๋ฒ ์ง์ด ๊ณก์ ์ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
addQuadCurve(to:,controlPoint:)๋ก ์ํ๋ ๊ณณ์ผ๋ก ๋ฅ๊ธ๊ฒ ๊ณก์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
S์ ๊ณก์ ์ ์ผ์ชฝ์ผ๋ก ์๋ก ๋ฅ๊ทผ ์ฟผ๋ ๊ณก์ ์ ๊ทธ๋ ค์ฃผ๊ฒ ์ต๋๋ค.
path.move(to: center)
path.addLine(to: CGPoint(x:center.x + 100, y: center.y))
path.addCurve(to: CGPoint(x:center.x + 100, y: center.y+100),
controlPoint1: CGPoint(x:center.x + 50, y: center.y+25),
controlPoint2: CGPoint(x:center.x + 150, y: center.y+75))
path.addQuadCurve(to: CGPoint(x:center.x, y: center.y+100),
controlPoint: CGPoint(x:center.x + 50, y: center.y+50))
์๋์ ๊ฐ์ด ์๋ก ๋ฅ๊ทผ 2์ฐจ ๋ฒ ์ง์ด ๊ณก์ ์ด ๊ทธ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
5. ๋ชจ์ ์์ฑ
์ํ๋ ๋ชจ์์ ๋ค ๊ตฌ์ฑํ์๋ค๋ฉด ๋ค ๊ทธ๋ ธ๋ค๊ณ ์ฝ๋๋ก ์๋ ค์ค์ผ๊ฒ ์ฃ ?
๋ฐ๋ก close() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๊ฐ ์์ฑ๋์์์ ์๋ ค์ค๋๋ค.
path.close()
6. ํ์ฌ ์์น
currentPoint ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ ค์ค ๋ชจ์์ ํ์ฌ ์์น๊ฐ ์ด๋์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
print(path.currentPoint)//(195.0, 422.0)
Drawing Properties & Paths
์์์ ์ํ๋ ๋ชจ์์ ์ด๋ค ์์ผ๋ก ์ฑ์ธ์ง, ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ด๋ค ์์ผ๋ก, ์ผ๋งํผ์ ๋๊ป๋ก ํ ๊ฑด์ง๋ฅผ ์ ํ์ต๋๋ค.
์ด ์ธ์๋ ์ ์ ๋ชจ์, ๋ถ๋๋ฌ์ ์ ๋ ๋ฑ์ ์ ํ ์ ์์ต๋๋ค.
1. ์ ๊ทธ๋ฆฌ๊ธฐ
๋จผ์ ์ ์ ๊ทธ๋ฆด์ง๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋๋ฐ์.
stroke ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
path.stroke()
2. ์ ์ ๋๊ป
์ ์ ๋๊ป๋ ์์์ ๋ค๋ค๋ค์ํผ lineWidth๋ก ์ ํ ์ ์์ต๋๋ค.
path.lineWidth = 10
3. ์ ์๊น ์ ํ๊ธฐ
์ํ๋ ์๊น์ setStroke ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์์ผ๋ก ์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
UIColor.systemYellow.setStroke()
์ ์ธ๊ฐ ๋งค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๋๊ป๊ฐ 10์ด๊ณ ๋ ธ๋์์ธ ์ ์ด ๊ทธ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
4. ์ ์ ๋ ๋ฅ๊ธ๊ฒ ํ๊ธฐ
lineCapStyle๋ก ์ ์ ๋์ ๋ชจ์์ ์ ํ ์ ์๋๋ฐ์.
์ด butt,round,square๊ฐ ์์ต๋๋ค.
ํ์ง๋ง butt,square์ ๋ณดํต ์ ์ด ๊ทธ๋ ค์ง ๋์ฒ๋ผ ๊ฐ์ง ๋ชจ์์ผ๋ก ํ์๋๊ฒ ๋๋ฌธ์ ํจ์คํ๊ฒ ์ต๋๋ค.
path.lineCapStyle = .round
์๋์ ๊ฐ์ด ์ ์ ๋ ์ ์ด ๋ฅ๊ธ๊ฒ ๋ฉ๋๋ค. (์ฃผ์ํ ์ ์ path.close() ์ ์ ์ ์ฉํด์ผ ํฉ๋๋ค.)
์์์ ๋ง๋ค์ด ์ค ๋ชจ์์ ์ ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๋๊ณผ ์์๋ง ๋ฅ๊ธ๊ฒ ๋ฉ๋๋ค.
6. ๋ชจ๋ ๋ชจ์๋ฆฌ ๋ฅ๊ธ๊ฒ ํ๊ธฐ
์์์ lineCapStyle์ด ์์๊ณผ ๋ ์ ๋ง ๋ฅ๊ธ๊ฒ ํ๋ค๋ฉด lineJointStyle์ ๋ชจ๋ ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ ๋ฅ๊ธ๊ฒ ํ๋ ๋ฉ์๋์ ๋๋ค.
lineJointStyle์ ์ด miter,bevel,round 3๊ฐ๊ฐ ์์ต๋๋ค. (miter๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ ค์ง๋ ์ ์คํ์ผ์ ๋๋ค.)
๋จผ์ round๋ ์๋์ ๊ฐ์ด ๋ชจ๋ ๋ถ๋ถ์ด ๋ฅ๊ธ๊ฒ ๋ฉ๋๋ค.
path.lineJoinStyle = .round
bevel์ ๋ชจ์๋ฆฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ(?) ๋ง๋ค์ด ์ค๋๋ค.
path.lineJoinStyle = .bevel
7. ์ ์ฑ์ฐ๊ธฐ
๋ชจ์์ ๋ง๋ค์๋ค๋ฉด ์์ ์ํ๋ ์์ผ๋ก ์ฑ์ธ ์ ์๋๋ฐ์.
๋ฐ๋ก fill ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ํ๋ ์.setFill()๋ก ์์ ์ง์ ํด์ฃผ๊ณ , fill() ๋ฉ์๋๋ก ์์ ์ฑ์์ค๋๋ค.
UIColor.systemBlue.setFill()
path.fill()
fill(with:,alpha:) ํ๋ผ๋ฏธํฐ๋ก ๋ธ๋ ๋ ๋ชจ๋์ ํฌ๋ช ๋๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
path.fill(with: CGBlendMode.darken, alpha: 0.5)
์๋์ ๊ฐ์ด ์ ์ฒด์ ์ธ ์์ ํฌ๋ช ๋๋ ์ ์ด์ง๊ณ , ๊ฒน์น ๋ถ๋ถ์ ์งํ๊ฒ ๋ฉ๋๋ค.
8. ๋์ฌ ์คํ์ผ ์
์ ์ ๋์ฌ ์คํ์ผ๋ก ๋ง๋ค ์ ์๋๋ฐ์.
setLineDash(pattern:,count:,phase:) ์ผ๋ก ๋์ฌ ์คํ์ผ์ ์ ํ ์ ์๋๋ฐ์.
๋จผ์ pattern์ ์ง์ ๋ฒ์งธ๋ ๋์ฌ์ ๊ธธ์ด, ํ ์๋ฒ์งธ๋ ์ฌ๋ฐฑ์ ์๋ฏธํฉ๋๋ค.
์ฆ [10,1,5,2] ๋ 10๊ธธ์ด์ ์ ๊ณผ 1์ ์ฌ๋ฐฑ 5๊ธธ์ด์ ์ ๊ณผ 2๊ธธ์ด์ ์ฌ๋ฐฑ์ด ๋ฐ๋ณต๋ฉ๋๋ค.
path.setLineDash([10,1,5,2], count: 4, phase: 0)
๊ทธ ๋ค์ count๋ pattern์ ์ด๋๊น์ง ์ ์ฉํ ๊ฑด์ง๋ฅผ ์ ํ๋ ๊ฒ์ธ๋ฐ์.
์์์ 4๋ก ์ ์ฉํ์ผ๋ฏ๋ก 10,1,5,2๊ฐ ์ ์ฉ๋ฉ๋๋ค.
ํ์ง๋ง 2๋ก ์ค์ ํ๋ฉด 10,1๊น์ง๋ง ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
path.setLineDash([10,1,5,2], count: 4, phase: 0)
phase๋ ์ด๋ ์ง์ ๋ถํฐ ์์ํ ๊ฑด์ง๋ฅผ ์ ํ๋ ๊ฒ์ ๋๋ค.
์ ํจํด์ผ๋ก ์งํํ๋ฉด 10๊ทธ๋ฆฌ๊ณ 1 ๋๊ณ 5 ๊ทธ๋ฆฌ๊ณ 2 ๋๊ณ ... ๋ฐ๋ณต์ด๊ฒ ์ฃ ?
๋ง์ฝ phase๋ฅผ 4๋ก ์ง์ ํ๋ค๋ฉด 4๋ถํฐ ์์ํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก (10-4)6๊ทธ๋ฆฌ๊ณ 1 ๋๊ณ 5 ๊ทธ๋ฆฌ๊ณ 2๋๊ณ 10 ๊ทธ๋ฆฌ๊ณ ...๊ฐ ๋ฐ๋ณต๋๋ ๊ฒ์ ๋๋ค.
phase๋ฅผ 10์ผ๋ก ์ง์ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด (10-10)0 ๊ทธ๋ฆฌ๊ณ 1๋๊ณ 5๊ทธ๋ฆฌ๊ณ 2๋๊ณ 10 ๊ทธ๋ฆฌ๊ณ ... ๊ฐ ๋ฐ๋ณต๋๊ฒ ๋ฉ๋๋ค.
path.setLineDash([10,1,5,2], count: 4, phase: 10)
1 ๋๊ณ ๋ถํฐ ์์์ด๋ฏ๋ก ์์ ๋ถ๋ถ์ด 1 ์ฌ๋ฐฑ์ผ๋ก ์์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ค๋์ ๊ทธํ ๋ก ์ ๋ฆฌํ๊ณ ์ถ์๋ UIBezierPath์ ๋ํด ์์ ๋ณด์์ต๋๋ค.
์๋ฒฝํ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฌ ๊ฑด ์๋์ง๋ง ๊ทธ๋๋ ํ 80~90%๋ ์ ๋ฆฌํ๋ค๊ณ ์๊ฐ์ด ๋ค์ด์ ๋ฟ๋ฏํ๋ค์...ใ
๊ถ๊ธํ์ ์ ์ด๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๋๊ธ