Создайте подпредставление с помощью CGPath, а затем добавьте UIPanGestureRecognizer в это подпредставление.

Я видел несколько ответов о добавлении GestureRecognzier в subViews, но моя проблема в том, что у меня заранее нет фрейма subView. Я рисую CGPath и методом Touches Ended хочу создать новый subView с рамкой, равной ограничивающей рамке CGPath. После этого я хочу перетащить этот subView с PanGestureRecognizer. Я пытаюсь реализовать функциональность Evernote crop, когда пользователь выбирает определенную область просмотра и перемещает ее в другую позицию. Это правильный подход к этому решению?


person HussnainWaris    schedule 06.02.2017    source источник


Ответы (1)


Не совсем понимаю взаимосвязь между UIGestureRecognizer и .frame. вы можете просто добавить UIGestureRecognizer к объекту после завершения его инициализации. Попробуйте добавить жест в методе TouchEnd сразу после отрисовки подвида.

import UIKit

class GestureResearchVC: UIViewController{

    var subViewByCGPath: UIView?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func createSubView(){
        //creat subview
        subViewByCGPath = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        subViewByCGPath?.backgroundColor = UIColor.yellow
        let circlePath = UIBezierPath(arcCenter: CGPoint(x: 50,y: 50), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.cgPath
        shapeLayer.strokeColor = UIColor.red.cgColor

        subViewByCGPath?.layer.addSublayer(shapeLayer)
        self.view.addSubview(subViewByCGPath!)

        //add pan gesture to subViewByCGPath
        let gesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureAction(rec:)))
        subViewByCGPath?.addGestureRecognizer(gesture)
}

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if subViewByCGPath == nil {
            print("touch end once")
            createSubView()
        }else{
            print("touch end repeatedly")
        }
    }

    func panGestureAction(rec: UIPanGestureRecognizer){
        print("pannnnnnn~")
        let transPoint = rec.translation(in: self.view)
        let x = rec.view!.center.x + transPoint.x
        let y = rec.view!.center.y + transPoint.y

        rec.view!.center = CGPoint(x: x, y: y)
        rec.setTranslation(CGPoint(x: 0, y: 0), in: self.view)

        //distinguish state
        switch rec.state {
            case .began:
                print("began")
            case .changed:
                print("changed")
            case .ended:
                print("ended")
            default:
                print("???")
        }
    }
}
person Chen Wei    schedule 06.02.2017
comment
Как я могу использовать состояния GestureRecognizer, такие как . начался или .cancelled в этом коде. Когда панорама закончилась, я хочу выполнить другое действие. или Коротко Могу ли я проверить, когда панорамирование закончилось в subView. Спасибо - person HussnainWaris; 06.02.2017
comment
Вы можете использовать свойство .state, просмотрите мой код (отредактировано) - person Chen Wei; 06.02.2017
comment
Если я хочу создать subViewByCGPath и добавить его в другой subView (скажем, DrawingView). Какие изменения вы бы порекомендовали в функции panGestureAction для перевода? - person HussnainWaris; 07.02.2017
comment
@HussnainWaris В основном жест панорамирования используется для постоянного обновления положения объекта. В этом случае демонстрация уже сделана. Если цель состоит в том, чтобы добавить это подпредставление (созданное CGPath) в другое подпредставление (DrawingView) при вызове функции panGestureAction, вы должны использовать tapGesture и реализовать эту логику при завершении касания. - person Chen Wei; 07.02.2017
comment
Спасибо за демонстрацию. Мне нужно добавить subViewbyCGPath в другой SubView (DrawingView), а затем добавить PanGesture в subViewByCGPath. func panGestureAction(rec: UIPanGestureRecognizer){ print("pannnnnnn~") let transPoint = rec.translation(in: TouchDrawing.view) let x = rec.view!.center.x + transPoint.x let y = rec.view!.center.y + transPoint.y rec.view!.center = CGPoint(x: x, y: y) rec.setTranslation(CGPoint(x: 0, y: 0), in: TouchDrawing.view) } - person HussnainWaris; 07.02.2017