2017-10-25 2 views
1

Ich möchte drehen und skalieren Ansicht auf einmal mit einzelnen Finger in swift 3.0 Ich habe viele Lösung in objective gefunden, aber ich bin fest wandeln Sie es in schnell um. ich habe folgenden Code für verwenden Ansicht drehenWie kann ich drehen und Größe der Ansicht auf einmal mit Single Finger mit swift 3.0

let panRotateGesture = UIPanGestureRecognizer(target: self, action: #selector(self.rotateViewPanGesture)) 
    rotateView?.addGestureRecognizer(panRotateGesture) 
    panRotateGesture.require(toFail: panRotateGesture) 
    textView?.addSubview(rotateView!) 

RotateViewPanGesture Funktion

func rotateViewPanGesture(_ recognizer: UIPanGestureRecognizer) { 

    if recognizer.state == .began { 

     deltaAngle = atan2(Float(recognizer.location(in: textView).y - textView!.center.y), Float(recognizer.location(in: textView).x - textView!.center.x)) 
     startTransform = (textView?.transform)! 

    } else if recognizer.state == .changed { 

     let ang: Float = atan2(Float(recognizer.location(in: textView!.superview).y - textView!.center.y), Float(recognizer.location(in: textView!.superview).x - textView!.center.x)) 
     let angleDiff: Float = deltaAngle - ang 
     textView?.transform = CGAffineTransform(rotationAngle: -(CGFloat)(angleDiff)) 
     textView?.setNeedsDisplay() 

    } else if recognizer.state == .ended { 

     deltaAngle = atan2(Float(recognizer.location(in: textView).y - textView!.center.y), Float(recognizer.location(in: textView).x - textView!.center.x)) 
     startTransform = (textView?.transform)! 
     textView?.setNeedsDisplay() 

    } 

} 

hier Textview ist meine Ansicht, die ich mag drehen und ändern.

Im Anschluss an mein Code für Ändern der Größe einer Ansicht

func resizeViewPanGesture(_ recognizer: UIPanGestureRecognizer) { 

     let translation = recognizer.translation(in: recognizer.view) 

     if let view = recognizer.view { 
      view.transform = (textView?.transform.translatedBy(x: translation.x, y: translation.y))! 
     } 

     recognizer.setTranslation(CGPoint.zero, in: recognizer.view) 
    } 

} 

aber es nicht funktioniert für mich. jemand bitte helfen Sie mir dabei, wie kann ich drehen und Größe ändern mit einzelnen Finger auf einmal in swift 3

Antwort

1

Ich habe mein Problem mit dem folgenden Code gelöst. Es hilft mir, das Bild mit einem Finger zu drehen und zu skalieren.

func stickerResizeGesture(_ recognizer: UIPanGestureRecognizer) { 

    let superview = recognizer.view?.superview 

    stickerContainerView = superview 

    for element in (superview?.subviews)! { 

     if element.accessibilityHint == "Main Image" { 
      imgSticker = element as! UIImageView 
     } 

     if element.accessibilityHint == "Delete" { 
      deleteView = element as? UIImageView 
     } 

     if element.accessibilityHint == "Rotate" { 
      rotateView = element as? UIImageView 
     } 

     if element.accessibilityHint == "Resize" { 
      resizeView = element as? UIImageView 
     } 
    } 

    let touchLocation = recognizer.location(in: stickerContainerView?.superview) 

    let center = CalculateFunctions.CGRectGetCenter((stickerContainerView?.frame)!) 

    if recognizer.state == .began { 

     prevPoint = recognizer.location(in: stickerContainerView?.superview) 


     //Rotate 
     deltaAngle = Float(atan2(touchLocation.y - center.y, touchLocation.x - center.x) - CalculateFunctions.CGAffineTrasformGetAngle(self.startTransform)) 

     initialBounds = stickerContainerView?.bounds 

     initialDistance = CalculateFunctions.CGpointGetDistance(center, point2: touchLocation) 
     //stickerContainerView?.setNeedsDisplay() 


    } else if recognizer.state == .changed { 

     if (stickerContainerView?.bounds.size.width)! < CGFloat(100.0) { 


      stickerContainerView?.bounds = CGRect(x: (stickerContainerView?.bounds.origin.x)!, 
                y: (stickerContainerView?.bounds.origin.y)!, 
                width: (stickerContainerView?.bounds.size.width)!, 
                height: (stickerContainerView?.bounds.size.width)!) 

      imgSticker.frame = CGRect(x: 12, 
             y: 12, 
             width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!) 

      resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!, 
             width: (resizeView?.frame.width)!, 
             height: (resizeView?.frame.height)!) 


      rotateView?.frame = CGRect(x: 0, 
             y: (stickerContainerView?.bounds.size.height)! - (rotateView?.frame.height)!, 
             width: (rotateView?.frame.width)!, 
             height: (rotateView?.frame.height)!) 

      deleteView?.frame = CGRect(x: 0, 
             y: 0, 
             width: (deleteView?.frame.width)!, 
             height: (deleteView?.frame.height)!) 

     } else if (stickerContainerView?.bounds.size.height)! < CGFloat(100.0) { 

      stickerContainerView?.bounds = CGRect(x: (stickerContainerView?.bounds.origin.x)!, 
                y: (stickerContainerView?.bounds.origin.y)!, 
                width: (stickerContainerView?.bounds.size.height)!, 
                height: (stickerContainerView?.bounds.size.height)!) 


      imgSticker.frame = CGRect(x: 12, y: 12, 
             width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!) 

      resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!, 
             width: (resizeView?.frame.width)!, 
             height: (resizeView?.frame.height)!) 

      rotateView?.frame = CGRect(x: 0, y: (stickerContainerView?.bounds.size.height)! - (rotateView?.frame.height)!, 
             width: (rotateView?.frame.width)!, 
             height: (rotateView?.frame.height)!) 

      deleteView?.frame = CGRect(x: 0, 
             y: 0, 
             width: (deleteView?.frame.width)!, 
             height: (deleteView?.frame.height)!) 

     } else { 

      let point: CGPoint = recognizer.location(in: stickerContainerView!.superview) 

      let newHeight = (stickerContainerView?.bounds.size.width)! + CGFloat(point.y - prevPoint.y) 
      let newWidth = (stickerContainerView?.bounds.size.height)! + CGFloat(point.y - prevPoint.y) 

      if newHeight < CGFloat(100.0) && newWidth < CGFloat(100.0) { 

       stickerContainerView?.bounds = CGRect(x: stickerContainerView!.bounds.origin.x, 
                 y: stickerContainerView!.bounds.origin.y, 
                 width: 100.0, 
                 height: 100.0) 


      } else { 

       stickerContainerView?.bounds = CGRect(x: stickerContainerView!.bounds.origin.x, 
                 y: stickerContainerView!.bounds.origin.y, 
                 width: newWidth, 
                 height: newHeight) 

      } 


      imgSticker.frame = CGRect(x: 12, 
             y: 12, 
             width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!) 

      resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!, 
             y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!, 
             width: (resizeView?.frame.width)!, 
             height: (resizeView?.frame.height)!) 

      rotateView?.frame = CGRect(x: 0, 
             y: (stickerContainerView?.bounds.size.height)! - 25, 
             width: (rotateView?.frame.width)!, 
             height: (rotateView?.frame.height)!) 

      deleteView?.frame = CGRect(x: 0, 
             y: 0, 
             width: (deleteView?.frame.width)!, 
             height: (deleteView?.frame.height)!) 

      prevPoint = recognizer.location(in: stickerContainerView?.superview) 

     } 

     // Rotate 

     let ang: Float = atan2(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x)) 

     let angleDiff = deltaAngle - ang 

     stickerContainerView?.transform = CGAffineTransform(rotationAngle: -(CGFloat)(angleDiff)) 
     stickerContainerView?.setNeedsDisplay() 


    } else if recognizer.state == .ended { 


     prevPoint = recognizer.location(in: stickerContainerView?.superview) 

     //Rotate 

     let ang: Float = atan2(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x)) 
     startTransform = (stickerContainerView?.transform)! 

     // stickerContainerView?.setNeedsDisplay() 


    } 

} 
Verwandte Themen