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
0
A
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("???")
}
}
}
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
Vous pouvez utiliser la propriété '.state', parcourir mon code (édité) –
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