에 CAShapeLayer 클릭 터치를 감지하는 경로를 원! 그것은 내가 화면을 클릭 할 때 어디에서나 작동하며, 파란색 공을 클릭 할 때 만 드래그하려고합니다.나는 빨간색으로 드래그 할 수있는 파란색 공을 만든 스위프트
이 내 코드는 지금까지 있습니다 :
override func viewDidLoad() {
super.viewDidLoad()
circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX,y: earthY), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
shapeLayer2.path = circlePath2.CGPath
shapeLayer2.fillColor = UIColor.blueColor().CGColor
shapeLayer2.strokeColor = UIColor.clearColor().CGColor
shapeLayer2.lineWidth = 7
view.layer.addSublayer(shapeLayer2)
let dragBall = UIPanGestureRecognizer(target: self, action:#selector(ViewController.dragBall(_:)))
view.addGestureRecognizer(dragBall)
}
@IBAction func dragBall(recognizer: UIPanGestureRecognizer) {
let point = recognizer.locationInView(self.view)
let earthX = Double(point.x)
let earthY = Double(point.y)
let midViewXDouble = Double(midViewX)
let midViewYDouble = Double(midViewY)
let angleX = (earthX - midViewXDouble)
let angleY = (earthY - midViewYDouble)
angle = atan2(angleY, angleX)
let earthX2 = midViewXDouble + cos(angle)*100
let earthY2 = midViewYDouble + sin(angle)*100
circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX2,y: earthY2), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
shapeLayer2.path = circlePath2.CGPath
}
나는 dragBall 함수에 아래의 코드를 추가하려고로 한 Statment는 경우 : (사용자가 파란색 공에 정확히 닿을 경우 감지)
if ((point.x >= circlePath2.currentPoint.x - circlePath2.bounds.width/2) && (point.y <= circlePath2.currentPoint.y + circlePath2.bounds.height/2)) && ((point.y >= circlePath2.currentPoint.y - circlePath2.bounds.height/2) && (point.y <= circlePath2.currentPoint.y + circlePath2.bounds.height/2)){
효과가 있었지만 터치가 파란색 볼 위치를 벗어나지 않는 경우에만 드래그 할 수 있습니다. 예를 들어 터치 할 때만 볼을 터치하고 싶을 때와 같이 할 수 있습니다. 내 끌기는 비명에 어딘가에있다. 응 - 안돼.
바로 가기 : 터치 할 때만 공을 드래그 시작 & 내 터치가 화면 어디에서나 계속 끌면 계속 드래그합니다.
당신이 예를 들어 줄 수 있습니까? UIPanGestureRecognizer를 UIGestureRecognizerStateBegan으로 변경하면 오류가 발생합니다. – Eliko
하지만 공은 UIView가 아니며 CAShapeLayer는 – Eliko
과 같은 개념입니다. 모양 레이어의 프레임을 가져 와서 터치가 프레임 안에 있는지 확인한 다음 제스처 인식기를 허용하거나 허용하지 않습니다. – daltonclaybrook