Невозможно заставить UIPanGesturerRecognizer работать для дочернего UIView родительского UIImageView - swift - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть приложение, которое имеет UIImageView, у которого есть подпредставление (UIView), которое содержит CAShapeLayer, который я использовал, чтобы нарисовать синий круг. Я хотел бы, чтобы пользователь мог перетаскивать синий круг в любом месте над UIImageView. Моя проблема заключается в следующем. Я сделал CAShapeLayer тем же CGRect, что и родительский UIView, так что пользователь должен фактически коснуться синего круга, прежде чем сможет перетаскивать его. Когда я делаю это, мои переводы больше не работают. Тем не менее, если я сделаю кадр UIView таким же, как родительский UIImagView, перетаскивание синего круга будет включено, но тогда пользователю необязательно будет касаться синего круга, чтобы иметь возможность его перетаскивать.

class DrawCircleViewController: UIViewController {

var circleSize = CGRect.init(x: 60, y: 80, width: 15, height: 15)
var firstDotView: UIView?
@IBOutlet weak var imgView: UIImageView!


// LAYERS
let layer1 = CAShapeLayer()
let layer2 = CAShapeLayer()


override func viewDidLoad() {
    super.viewDidLoad()

    firstDotView = UIView.init()
    firstDotView?.frame = circleSize

    imgView.addSubview(firstDotView!)

    // DRAW A FILLED IN BLUE CIRCLE
    drawBlueCircle()

    imgView.isUserInteractionEnabled = true
    firstDotView!.isUserInteractionEnabled = true

    // ADD GESTURE RECOGNIZER
    let firstDotPanRecgnzr = UIPanGestureRecognizer.init(target: self, action: #selector(firstDotHandler(sender:)))
    firstDotView?.addGestureRecognizer(firstDotPanRecgnzr)

}


@objc func firstDotHandler(sender: UIPanGestureRecognizer) -> Void {

    let firstDot = sender.view
    let translation = sender.translation(in: view)
    if(sender.state == .began || sender.state == .changed){
        firstDot?.center = CGPoint.init(x: (firstDot?.center.x)! + translation.x, y: (firstDot?.center.y)! + translation.y)
        sender.setTranslation(CGPoint.zero, in: self.view)
    }
}



func drawBlueCircle(){

    layer1.path = UIBezierPath.init(roundedRect: circleSize, cornerRadius: 50).cgPath
    layer1.fillColor = UIColor.blue.cgColor
    firstDotView?.layer.addSublayer(layer1)
}

}

Scenen UI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...