2017-02-06 2 views
0

J'ai vu plusieurs réponses à propos de l'ajout d'un GestureRecognzier aux sous-vues, mais mon problème est que je n'ai pas l'image de la sous-vue disponible auparavant. Je dessine un CGPath et à la méthode Touches Ended, je veux créer un nouveau subView avec cadre égal à CGPath bounding box. Après cela, je veux faire glisser subView avec PanGestureRecognizer. J'essaye d'implémenter la fonctionnalité Evernote crop où l'utilisateur sélectionne une certaine zone de vue et la déplace vers une autre position. Est-ce la bonne approche de cette solution?Créer une sous-vue en utilisant CGPath et que d'ajouter UIPanGestureRecognizer sur cette sous-vue

Répondre

0

Je ne comprends pas tout à fait la relation entre UIGestureRecognizer et .frame. vous pouvez simplement ajouter UIGestureRecognizer à l'objet, une fois son travail init terminé. Essayez d'ajouter un geste dans la méthode TouchEnd directement après avoir dessiné la sous-vue.

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("???") 
     } 
    } 
} 
+0

Comment puis-je utiliser les états GestureRecognizer tels que. commencé ou .cancelled dans ce code. Quand le panoramique est terminé, je veux effectuer une autre action. ou Peu de temps Puis-je vérifier quand le panoramique est terminé sur la sous-vue. Merci – HussnainWaris

+0

Vous pouvez utiliser la propriété '.state', parcourir mon code (édité) –

+0

Si je veux créer subViewByCGPath et l'ajouter à un autre subView (disons DrawingView). Quels changements recommanderiez-vous à la fonction panGestureAction pour la traduction? – HussnainWaris