2017-07-30 311 views
2

我試圖製作一個TextView,可以像Snapchat一樣移動。我做了類似的東西,雖然當你在旋轉時嘗試和縮放時,它往往會無限地水平拉伸,有時拖動也會有點小錯誤。像Snapchat一樣同時捏,平移和旋轉文本[SWIFT 3]

我有這樣的:

func panGesture(pan: UIPanGestureRecognizer) { 
    print("Being Dragged") 
    if pan.state == .began { 
     textViewOrigin = pan.location(in: textView) 
    }else { 
     let location = pan.location(in: view) // get pan location 
     textView.frame.origin = CGPoint(x: location.x - textViewOrigin.x, y: location.y - textViewOrigin.y) 
    } 
} 
func scaleGesture(_ gesture: UIPinchGestureRecognizer){ 
    print("Being Scaled") 
    switch gesture.state{ 
    case.began: 
     identity = textView.transform 
    case.changed,.ended: 
     textView.transform = identity.scaledBy(x: gesture.scale, y: gesture.scale) 
    default: 
     break 
    } 
} 
func rotationGesture(sender: UIRotationGestureRecognizer){ 
    print("Being Rotated") 
    textView.transform = textView.transform.rotated(by: sender.rotation) 
    sender.rotation = 0 
} 

,我試圖做到這一點: enter image description here

如果有人可以幫助提前改變或重新編寫我的代碼,這將是巨大的,謝謝!

回答

7

默認情況下,一旦某個視圖上的一個手勢識別器「聲明」該手勢,則其他人無法識別該點的手勢。

因此,對於同時手勢識別你在UIGestureRecognizer delegate.

class ViewController: UIViewController,UIGestureRecognizerDelegate { 

    @IBOutlet var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     //add pan gesture 
     let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     gestureRecognizer.delegate = self 
     textField.addGestureRecognizer(gestureRecognizer) 

     //Enable multiple touch and user interaction for textfield 
     textField.isUserInteractionEnabled = true 
     textField.isMultipleTouchEnabled = true 

     //add pinch gesture 
     let pinchGesture = UIPinchGestureRecognizer(target: self, action:#selector(pinchRecognized(pinch:))) 
     pinchGesture.delegate = self 
     textField.addGestureRecognizer(pinchGesture) 

     //add rotate gesture. 
     let rotate = UIRotationGestureRecognizer.init(target: self, action: #selector(handleRotate(recognizer:))) 
     rotate.delegate = self 
     textField.addGestureRecognizer(rotate) 


    } 

    func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) { 
     if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { 

      let translation = gestureRecognizer.translation(in: self.view) 
      // note: 'view' is optional and need to be unwrapped 
      gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y) 
      gestureRecognizer.setTranslation(CGPoint.zero, in: self.view) 
     } 

    } 

    func pinchRecognized(pinch: UIPinchGestureRecognizer) { 

     if let view = pinch.view { 
      view.transform = view.transform.scaledBy(x: pinch.scale, y: pinch.scale) 
      pinch.scale = 1 
     } 
    } 

    func handleRotate(recognizer : UIRotationGestureRecognizer) { 
     if let view = recognizer.view { 
      view.transform = view.transform.rotated(by: recognizer.rotation) 
      recognizer.rotation = 0 
     } 
    } 

    //MARK:- UIGestureRecognizerDelegate Methods 
    func gestureRecognizer(_: UIGestureRecognizer, 
     shouldRecognizeSimultaneouslyWith shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool { 
     return true 
    } 
} 
壓倒一切的功能