์๋ ํ์ธ์ Foma ๐ป ์ ๋๋ค!
์ค๋์ ์ค์ ๋งค๋ฌ๋ ค ํ๋ค๋ฆฌ๋ ์์๋ฅผ ๋ง๋ค์ด ๋ณผ๊ฑด๋ฐ์.
์ด๊ฑด ์ ๊ฐ ์กด๊ฒฝํ๋ ๊ฐ๋ฐ์์ด๊ธฐ๋ ํ ์ธํฐ๋ํฐ๋ธ ๋๋ฒจ๋กํผ ๊น์ข ๋ฏผ๋์ ์ ํ๋ธ ์ฑ๋์ ์ฌ๋ผ์จ ํํ ๋ฆฌ์ผ ์ค ํ๋์ธ๋ฐ์.
์์ ๋ถํฐ ์ด๋ฐ ์ฐฝ์์ ์ธ ์ฝ๋ฉ, ์์ ์ ์ธ ์ฝ๋ฉ์ ํ๊ณ ์ถ์ ์์ฌ์ด ๋ง์์๋๋ฐ ์ด๋ฒ ๊ธฐํ์ ๊น์ข ๋ฏผ๋์ ๋ฐ๋ผ์ ๊ตฌํํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ์์์ ๋ณด๋ฉฐ ๋๋ฆ ์ ๋ฐฉ์๋๋ก Swift๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด๋ณด์์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
View
๋จผ์ ์์์ ๋นจ๊ฐ ์ ์ UIView๋ก ์ธํ ํด์ค๋๋ค.
(์ ๋ ์์ ๊ฐ์ด๋ฐ์ ์ ์ด๋ฆ์ ๋ฃ์ด์ ๋ณด์ฌ์ค ๊ฑฐ๊ธฐ ๋๋ฌธ์ label๋ ๋ฃ์์ต๋๋ค.)
let square:UIView = {
let view:UIView = UIView()
view.backgroundColor = .systemCyan
return view
}()
let redDot1:UIView = {
let view:UIView = UIView()
view.backgroundColor = .clear
return view
}()
let redDot2:UIView = {
let view:UIView = UIView()
view.backgroundColor = .clear
return view
}()
let label:UILabel = {
let label:UILabel = UILabel()
label.text = "Fomagran"
label.font = .systemFont(ofSize: 18, weight: .bold)
label.textColor = .white
return label
}()
1. ์์ ์์ง์ด๊ธฐ
์์๋ฅผ ํฐ์นํด์ ์์ง์ด๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ฐ๋ก ํฌ์ ์ค์ณ๋ผ๋ ๊ฒ์ ์ด์ฉํด์ฃผ์ด์ผ ํฉ๋๋ค.
์์์ ์๋์ ๊ฐ์ด ํฌ์ ์ค์ณ๋ฅผ ๋ฌ์์ค๋๋ค.
private func setPanGesture() {
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.dragSquare(_:)))
square.addGestureRecognizer(panGesture)
}
์์๋ฅผ ๋๋๊ทธ ํ์ ๋ ์๋์ ๊ฐ์ด ์คํ์์ผ์ฃผ๋ฉด
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
let transition = sender.translation(in: square)
let newX = square.center.x + transition.x
let newY = square.center.y + transition.y
square.center = CGPoint(x: newX, y: newY)
sender.setTranslation(CGPoint.zero, in: square)
}
์์๋ฅผ ์์ง์ผ ์ ์๊ฒ ๋ฉ๋๋ค.
2. ์์๋ฅผ ํฐ์นํ ๋ถ๋ถ ๋นจ๊ฐ ์ ์ผ๋ก ํ์ํ๊ธฐ
์ ์์์ ๋ณด๋ฉด ์์๋ฅผ ํฐ์นํ ๋ถ๋ถ์ ๋นจ๊ฐ ์ ์ด ์๊ธฐ๊ณ ์ ์ด ์๊ฒจ์ ๋งค๋ฌ๋ ค ์์ง์ด์ฃ ?
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์์๋ฅผ ๊ฐ์ฅ ์ฒ์์ ํฐ์นํ ๋ถ๋ถ์ ์์๋ผ ์ ์์๊น์?
๋ฐ๋ก ์ฒ์ ๋๋๊ทธ๋ฅผ ์์ํ ๋ ์์น๋ฅผ ์์๋ด๋ฉด ๋ฉ๋๋ค.
UIPanGestureRecognizer๋ฅผ ์ด์ฉํด์ ๋๋๊ทธ๊ฐ ์์๋ ๋ ์์น๋ฅผ ์์๋ ๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋นจ๊ฐ์ 1์ ์์ ๋นจ๊ฐ์์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
let location = sender.location(in: view) //๋๋๊ทธ๋ฅผ ์์ํ ์์น
redDot1.center = location
redDot1.backgroundColor = .red
...
์ด๋ ๊ฒ ํ๋ฉด ์๋์ ๊ฐ์ด ๋๋๊ทธ๋ฅผ ์์ํ ๋ ์ง์ ์ด ๋นจ๊ฐ์์ผ๋ก ํ์๋ฉ๋๋ค.
2. ๋ ๋ฒ์งธ ๋นจ๊ฐ์ ๋๋๊ทธ ์์น์ ํ์ํ๊ธฐ
์์๋ฅผ ํฐ์นํ ๋ถ๋ถ์ ๋นจ๊ฐ ์ ์ ํ์ํ๋ค๋ฉด ๋๋๊ทธ๋ฅผ ํ๋ ์์น์ ๋ฐ๋ผ ํ์๋๋ ๋นจ๊ฐ ์ ๋ ๋ณด์ฌ์ค์ผ๊ฒ ์ฃ ?
๋๋๊ทธ๊ฐ ๋ฐ๋ ๋์ ์์น๋ฅผ ์์๋ด์ด ๋นจ๊ฐ์ 2์ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋๋ค.
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
let location = sender.location(in: view) //๋๋๊ทธ๋ฅผ ์์ํ ์์น
redDot1.center = location
redDot1.backgroundColor = .red
}else if sender.state == .changed {
redDot2.center = sender.location(in: view)
redDot2.backgroundColor = .red
...
๊ทธ๋ผ ์๋์ ๊ฐ์ด ๋๋๊ทธ๋ฅผ ํ๋ฉด ์ฒ์ ์์น์ ๋๋๊ทธ๋ฅผ ํ๋ ์์น์ ๋ฐ๋ผ ๋นจ๊ฐ์ ๋ ๊ฐ๊ฐ ํ์๋ฉ๋๋ค.
3. ๋นจ๊ฐ ์ ๋ ๊ฐ ์ ์ผ๋ก ์๊ธฐ
์ด์ ๋นจ๊ฐ ์ ๋ ๊ฐ๋ฅผ ์ ์ผ๋ก ์ด์ด์ค์ผ๊ฒ ์ฃ ?
์ ์ ๋ง๋ค์ด ์ฃผ๊ธฐ ์ํด์ CAShapeLayer๋ก ๋ง๋ค์ด์ค์ผ ํฉ๋๋ค.
private var line = CAShapeLayer()
์๋์ ๊ฐ์ด ์์๊ณผ ๋์ ์ง์ ํด์ฃผ๊ณ ์ ์ผ๋ก ์ด์ด์ค๋๋ค.
private func addLine(start: CGPoint,end:CGPoint) {
line.removeFromSuperlayer()
let linePath = UIBezierPath()
linePath.move(to: start)
linePath.addLine(to: end)
line.path = linePath.cgPath
line.strokeColor = UIColor.red.cgColor
line.lineWidth = 1
view.layer.addSublayer(line)
}
๋นจ๊ฐ์ 1๊ณผ ๋นจ๊ฐ์ 2์ ์ค์ ๋ถ๋ถ์ ์ ์ผ๋ก ์ด์ด์ค๋๋ค.
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
let location = sender.location(in: view) //๋๋๊ทธ๋ฅผ ์์ํ ์์น
redDot1.center = location
redDot1.backgroundColor = .red
}else if sender.state == .changed {
redDot2.center = sender.location(in: view)
redDot2.backgroundColor = .red
addLine(start: redDot1.center,end:redDot2.center)
...
์๋์ ๊ฐ์ด ์ ์ผ๋ก ๋ ๊ฐ์ ์ ์ด ์ด์ด์ง๋๋ค.
4. ๋๋๊ทธ๊ฐ ๋๋๋ฉด ์ ๊ณผ ์ ์ฌ๋ผ์ง๊ฒ ํ๊ธฐ
๋๋๊ทธ๊ฐ ๋๋๋ ์๊ฐ์๋ ์ ๊ณผ ์ ์ด ์ฌ๋ผ์ ธ์ผ๊ฒ ์ฃ ?
๋นจ๊ฐ์ ๋ ๊ฐ์ ์ ์ ์์ ๋ฐ๊ฟ์ฃผ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ค๋๋ค.
private func changeColor(_ color:UIColor) {
redDot1.backgroundColor = color
redDot2.backgroundColor = color
line.strokeColor = color.cgColor
}
dragSquare ๋ฉ์๋์ ๋๋๊ทธ๊ฐ ๋๋ฌ์ ๋ ์์ ํฌ๋ช ์์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
...
}else if sender.state == .ended {
changeColor(.clear)
...
5. ํน์ ๊ธธ์ด ์ด์ ๋์ด๋๋ฉด ๋นจ๊ฐ์ 1 ์์ง์ด๊ธฐ
์ ์ ์ก์๋น๊ธฐ๋ค๊ฐ ํน์ ๊ธธ์ด ์ด์ ๋์ด๋๋ฉด ๋นจ๊ฐ์ 1์ ์์ง์ด๊ฒ ๋ง๋ค์ด ์ค๊ฑด๋ฐ์.
๋จผ์ ๋ ๊ฐ์ ์ ์ ๊ธธ์ด๋ฅผ ์์๋ด์ผ๊ฒ ์ฃ ?
์๋์ ๊ฐ์ด ๋ ๊ฐ์ ์ ์ ๊ธธ์ด๋ฅผ ์์๋ ๋๋ค.
private func getTwoPointDistance(_ point1:CGPoint,_ point2:CGPoint) -> CGFloat {
let xDist:CGFloat = point2.x - point1.x
let yDist:CGFloat = point2.y - point1.y
return sqrt((xDist * xDist) + (yDist * yDist))
}
dragSquare ๋ฉ์๋์์ ๋๋๊ทธ๊ฐ ๋ณํ ๋์ ์๋์ ๊ฐ์ด ๋ ๊ฐ์ ์ ์ ๊ธธ์ด๋ฅผ ์์๋ธ ๋ค
ํน์ ๊ธธ์ด ์ด์ ๋์ด๋๋ฉด ๋นจ๊ฐ์ 2์ ์์น๋ก ๋นจ๊ฐ์ 1์ ์์น๋ฅผ ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
}else if sender.state == .changed {
redDot2.center = sender.location(in: view)
redDot2.backgroundColor = .red
addLine(start: redDot1.center,end:redDot2.center)
let distance:CGFloat = getTwoPointDistance(redDot1.center,redDot2.center)
if distance > 100 {
redDot1.center = redDot2.center
}
์๋์ ๊ฐ์ด ๋ณด๋ฉด ์์๊ฐ ์์ง์ด๋๊ฒ ๋งค์ฐ ์ด์ํ์ฃ ?
UIView.animate๋ฅผ ์ฌ์ฉํ๋ฉด ์์ง์์ ํจ์ฌ ๋ถ๋๋ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
if distance > 100 {
UIView.animate(withDuration: 0.5) {
self.redDot1.center = self.redDot2.center
}
6. ์ ๋๊น ํ์ ํด๊ฒฐํ๊ธฐ
ํ์ง๋ง ์์์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ์ ๋ ๋ถ๋๋ฌ์์ง๊ธด ํ์ง๋ง ๋นจ๊ฐ์ 1์ด ์ด๋ ์ค์ ์ ๊น ์ ์ด ๋๊ธฐ๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
๊ทธ ์ด์ ๋ ์ ๋๋ฉ์ด์ ์ ์ฉํ๋ฉด ๋ฐ๋๋ ๊ฐ์ ๋ฐ๋ผ ์ ์ด ์ฐ๊ฒฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋๋ฉ์ด์ ์ด ๋ฐ๋๋ ๊ฐ์ ๋ฐ๋ผ ์ ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ฐ๋ก CADisplayLink๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค.
CADisplayLink๋ ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ํธ์ถ๋๋ NSObject์ธ๋ฐ์.
์๋์ ๊ฐ์ด ์ ์ธํด์ฃผ์๊ณ
var displayLink:CADisplayLink?
๋์คํ๋ ์ด๋งํฌ๋ฅผ ์์ฑํด ์ฃผ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ค๋๋ค.
private func createDisplayLink() {
let displaylink = CADisplayLink(target: self,selector: #selector(displayLinkLoop))
displaylink.add(to: .current,forMode:.common)
displayLink = displaylink
}
๊ทธ๋ฆฌ๊ณ ์ ๋๋ฉ์ด์ ์ด ์คํ๋๊ธฐ ์ง์ ์ ๋์คํ๋ ์ด ๋งํฌ๋ฅผ ์์ฑํด ์ค๋๋ค.
if distance > 100 {
createDisplayLink()
UIView.animate(withDuration: 0.5) {
self.redDot1.center = self.redDot2.center
}
๊ทธ๋ฆฌ๊ณ ๋์คํ๋ ์ด๋งํฌ๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด
@objc func displayLinkLoop(displaylink: CADisplayLink) {
print(displaylink)
ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ์๋์ ๊ฐ์ด ๋์คํ๋ ์ด ๋งํฌ๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ด๊ฒ์ ์ด์ฉํด์ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ์ง ์๊ณ ๋ถ๋๋ฝ๊ฒ ๋นจ๊ฐ์ 1์ ์ด๋์ํค๊ฒ ์ต๋๋ค.
๋นจ๊ฐ์ 2์ ์์น๋ฅผ ๊ธฐ์ตํ goal์ ๋ง๋ค์ด์ค๋๋ค.
var goal = CGPoint()
์๋์ ๊ฐ์ด ๋์คํ๋ ์ด๋งํฌ๋ฅผ ์์ฑํ๊ธฐ ์ง์ ์ goal์ ์์น๋ฅผ ๋นจ๊ฐ์ 2์ ์ค์์ผ๋ก ์ธํ ํฉ๋๋ค.
if distance > 100 {
goal = redDot2.center
createDisplayLink()
}
๊ทธ๋ฆฌ๊ณ ๋์คํ๋ ์ด ๋งํฌ๋ฅผ ํธ์ถํ๋ ๋ฉ์๋์ ์๋์ ๊ฐ์ด goal์ ์์น๊ฐ ๋ ๋๊น์ง ์ ์ผ๋ก ์ฐ๊ฒฐํด์ค๋๋ค.
@objc func displayLinkLoop(displaylink: CADisplayLink) {
if round(redDot1.center.x) == round(goal.x) && round(redDot1.center.y) == round(goal.y){
displaylink.invalidate()
line.strokeColor = UIColor.clear.cgColor
return
}
if round(redDot1.center.x) != round(goal.x) {
redDot1.center.x += redDot1.center.x < goal.x ? 1: -1
}
if round(redDot1.center.y) != round(goal.y) {
redDot1.center.y += redDot1.center.y < goal.y ? 1 : -1
}
addLine(start: redDot1.center,end: redDot2.center)
}
}
๊ทธ๋ผ ์๋์ ๊ฐ์ด ์ ๋๋ฉ์ด์ ์ ์ด์ฉํ์ง ์๊ณ ๋นจ๊ฐ ์ 1์ ์์น๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ด๋์ํฌ ์ ์์ต๋๋ค.
7. ๋นจ๊ฐ์ 1์ ์์น์ ๋ฐ๋ผ ์์ ์์ง์ด๊ธฐ
์ด์ ๋นจ๊ฐ์ 1์ ์์น์ ๋ฐ๋ผ์ ์์๋ฅผ ์์ง์ฌ๋ณด๋ ๊ฒ์ ๊ตฌํํ๊ฒ ์ต๋๋ค.
๋นจ๊ฐ์ 1์ ์์น๋ ๋งจ ์ฒ์ ๋๋๊ทธ๊ฐ ์์๋ ๊ณณ์ ์์น์ฃ ?
๊ณ ๋ก ๋นจ๊ฐ์ 1์ ์ค์๊ณผ ์์์ ์ค์์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค.
๋นจ๊ฐ์ 1๊ณผ ์์์ ์ฐจ์ด๋ฅผ ๊ธฐ๋กํ gap์ ๋ง๋ค์ด์ค๋๋ค.
private var gap:CGPoint = CGPoint()
๊ทธ๋ฆฌ๊ณ ๋๋๊ทธ๊ฐ ์์๋ ๋ ์์์ ๋นจ๊ฐ ์ ์ ์์น๋ฅผ ๊ณ์ฐํด์ gap์ ์ ์ฅํด์ค๋๋ค.
if sender.state == .began {
let location = sender.location(in: view)
gap.x = square.center.x - location.x
gap.y = square.center.y - location.y
๊ทธ ๋ค์ ๋์คํ๋ ์ด ๋งํฌ๊ฐ ํธ์ถ๋ ๋ ์์์ ์์น๋ฅผ ์ฐจ์ด๋งํผ ๋ํด์ค ๊ฐ์ผ๋ก ์ง์ ํด์ค๋๋ค.
@objc func displayLinkLoop(displaylink: CADisplayLink) {
if round(redDot1.center.x) == round(goal.x) && round(redDot1.center.y) == round(goal.y){
displaylink.invalidate()
line.strokeColor = UIColor.clear.cgColor
return
}
if round(redDot1.center.x) != round(goal.x) {
redDot1.center.x += redDot1.center.x < goal.x ? 1: -1
square.center.x = redDot1.center.x + gap.x
}
if round(redDot1.center.y) != round(goal.y) {
redDot1.center.y += redDot1.center.y < goal.y ? 1 : -1
square.center.y = redDot1.center.y + gap.y
}
addLine(start: redDot1.center,end: redDot2.center)
}
์๋์ ๊ฐ์ด ๋นจ๊ฐ์ 1์ ์์น์ ๋ฐ๋ผ ์์๊ฐ ์์ง์ด๊ฒ ๋ฉ๋๋ค.
8. ๋นจ๊ฐ์ 1๊ณผ ๋นจ๊ฐ์ 2์ ๊ฑฐ๋ฆฌ๋๊ธฐ(์ต์ ๋)
๋นจ๊ฐ์ 1์ด ๋นจ๊ฐ์ 2์ ์์น๋ก ๊ฐ๋ ๊ฒ์ด ์๋ ๊ทธ ๊ทผ์ฒ๋ก ๊ฐ๊ฒ๋ ๊ตฌํํ๊ณ ์ถ์๋๋ฐ์.
(์ด๊ฑด ํ์ ๋ ๋๊ณ ์ํ์ ๋ ๋ฉ๋๋ค.)
์ด๋ ๊ฒ ์ค๋ช ํ๋ฉด ์ดํด๊ฐ ์๋๋ ์ผ์ชฝ์ ๋นจ๊ฐ์ 2์ ์ขํ๊น์ง ์ด๋ํ๋ ๊ฒ์ด๊ณ ์ค๋ฅธ์ชฝ์ ๋นจ๊ฐ์ 2์ ๊ทผ์ฒ๊น์ง๋ง ์ด๋ํ๋ ๊ฒ์ ๋๋ค.
์์์ ์ค์์ ๊ธฐ์ค์ผ๋ก x,y์ ์์์ ์์์ ๋ฐ๋ผ ๋ฒ์๋ฅผ ๋๋๊ณ ๋นจ๊ฐ์ 2์ ์์น์ ๋ฐ๋ผ ๋นจ๊ฐ์ 1์ ์์น๋ฅผ
๊ตฌํด์ฃผ์์ต๋๋ค.
์๋์ ๊ฐ์ด ๋ฒ์์ ๋ฐ๋ผ ๊ตฌํ ์ ์์ต๋๋ค.
func getDestinationPoint(p2:CGPoint) -> CGPoint {
if p2.x <= center.x {
//1
if p2.y <= center.y {
return CGPoint(x: p2.x+50, y: p2.y+50)
//3
}else {
return CGPoint(x: p2.x+50, y: p2.y-50)
}
}else {
//2
if p2.y <= center.y {
return CGPoint(x: p2.x-50, y: p2.y+50)
//4
}else {
return CGPoint(x: p2.x-50, y: p2.y-50)
}
}
}
goal์ ์์น๋ฅผ ์๋์ ๊ฐ์ด ์ค์ ํด์ค๋๋ค.
if distance > 100 {
goal = square.getDestinationPoint(p2: redDot2.center)
createDisplayLink()
}
9. ์์ ํ์ ํ๊ธฐ
์ค์ ๋น๊ฒจ ์์๋ฅผ ์์ง์ผ ๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ์์๊ฐ ์ฝ๊ฐ์ฉ ํ์ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฒ ๋ํ ์์ฒ๋ผ ๋ฒ์๋ฅผ ๋๋ ๋นจ๊ฐ์ 2์ ์์น์ ๋ฐ๋ผ ์ด๋ ๋ฐฉํฅ์ธ์ง ์์๋ผ ์ ์์์ต๋๋ค.
๋ฒ์์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ํ์ ๊ฐ์ ์ง์ ํด์ฃผ์์ต๋๋ค.
(5๋ก ์ง์ ํ์ง๋ง ์ํ์๋ ํ์ ๊ฐ์ ๋ฃ์ผ์๋ฉด ๋ฉ๋๋ค.)
func getAngle(p2:CGPoint) -> CGFloat {
if p2.x <= center.x {
//1
if p2.y <= center.y {
return 5
//3
}else {
return -5
}
}else {
//2
if p2.y <= center.y {
return -5
//4
}else {
return 5
}
}
}
๊ทธ๋ฆฌ๊ณ ๋ทฐ๋ฅผ ํ์ ํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
func rotate(degrees: CGFloat) {
let degreesToRadians: (CGFloat) -> CGFloat = { (degrees: CGFloat) in
return degrees / 180.0 * CGFloat.pi
}
self.transform = CGAffineTransform(rotationAngle: degreesToRadians(degrees))
}
์๋์ ๊ฐ์ด ๋๋๊ทธ ๊ฐ์ด ๋ฐ๋ ๋ ๋นจ๊ฐ์ 2์ ์์น์ ๋ฐ๋ผ ๊ฐ๋๋ฅผ ๊ตฌํด ํ์ ํ๊ณ
๋๋๊ทธ๊ฐ ๋๋ ๋ ํ์ ์ 0๋๋ก ๋ง๋ค์ด ์ ์๋ฆฌ๋ก ๋์์ค๊ฒ ๊ตฌํํ์์ต๋๋ค.
@objc func dragSquare(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
let location = sender.location(in: view)
gap.x = square.center.x - location.x
gap.y = square.center.y - location.y
changeColor(.red)
redDot1.center = location
}else if sender.state == .changed {
redDot2.center = sender.location(in: view)
addLine(start: redDot1.center,end:redDot2.center)
let distance:CGFloat = getTwoPointDistance(redDot1.center,redDot2.center)
if distance > 100 {
goal = square.getDestinationPoint(p2: redDot2.center)
createDisplayLink()
let angle:CGFloat = square.getAngle(p2:redDot2.center)
rotateAndChangeColor(angle: angle, color: .systemRed)
}
}else if sender.state == .ended {
changeColor(.clear)
rotateAndChangeColor(angle: 0, color: .clear)
}
}
ํ์ ๊ณผ ์์ ๋ฐ๊ฟ์ค ๋ ์ ๋๋ฉ์ด์ ์ ์ค์ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค์ด ์ฃผ์์ต๋๋ค.
private func rotateAndChangeColor(angle:CGFloat,color:UIColor) {
UIView.animate(withDuration: 0.5) {
self.square.rotate(degrees:angle)
self.label.rotate(degrees:angle)
self.changeColor(color)
}
}
์๋์ ๊ฐ์ด ์ค์ ๋น๊ธฐ๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ์์๊ฐ ํ์ ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ค๋์ ์ด๋ ๊ฒ ์ธํฐ๋ํฐ๋ธ ๋๋ฒจ๋กํผ๋์ ํํ ๋ฆฌ์ผ์ ๊ตฌํํด๋ณด์๋๋ฐ์.
๋ณด๊ธฐ์ ์ ๋ง ๊ฐ๋จํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ๋ค์ด ์ง์ ๊ตฌํํ๋ ค๊ณ ํ๋ ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ณ ๊ฝค ๋ณต์กํ์ต๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ ํตํด์ ๋๋ฆ ๋ฐฐ์ด ๊ฒ๋ ๋ง๊ณ ์์ ๋ถํฐ ํ๊ณ ์ถ์๋ ํฌ๋ฆฌ์์ดํฐ๋ธ ์ฝ๋ฉ์ด๋ผ์ ๊ตฌํํ๊ณ ๋๋ ๋ฟ๋ฏํ๋ค์...ใ ใ
'๐ iOS > UI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/UI] Core Animation์ด๋? (feat. CALayer) (0) | 2022.03.16 |
---|---|
[๐งฉ Creative Coding] ์ปฌ๋ฌํํ ๋ฌผ๊ฒฐ ์จ์ด๋ธ ๋ง๋ค๊ธฐ(feat. Interactive Developer) (4) | 2021.12.16 |
[iOS/UI] ์ด๋ฏธ์ง ์ค์ผ๋ก ํ๋/์ถ์ํ๊ธฐ(feat. ์คํฌ๋กค๋ทฐ) (0) | 2021.11.03 |
[iOS] UIKit์์ SwiftUI Preview ์ฌ์ฉํด๋ณด๊ธฐ (2) | 2021.07.28 |
[iOS] UI Test ๊ฐ๋จํ๊ฒ ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2021.07.20 |
๋๊ธ