2017-10-25 4 views
1

スウィフト3.0でワンタッチでビューを一度に回転およびサイズ変更したいobjective-cで多くの解決策を見つけましたが、それを迅速に変換する。私はにしたい私の見解はを回転させ、のサイズを変更しているここでビュースウィフト3.0を使用してシングルフィンガーを使用して一度にビューを回転させたりサイズを変更する方法

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

RotateViewPanGesture機能

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() 

    } 

} 

回転ためのTextViewを次のコードを使用しています。続き

はビュー

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) 
    } 

} 

をリサイズための私のコードですが、それは私のために動作しません。私はこれで私を手伝ってください。どうすればいいですか?一度に1本の指で素早く回転してサイズを変更する方法3

答えて

1

私は次のコードを使用して問題を解決しました。その1つの指を使用してイメージを回転し、サイズ変更するのを助けます。

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() 


    } 

} 
関連する問題