2017-10-25 1 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() 

    } 

} 

텍스트 뷰의 크기를 조정 회전에 내가 원하는 내이다. 다음

나를 위해보기

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

다음 코드를 사용하여 문제를 해결했습니다. 그 하나의 손가락을 사용하여 이미지를 회전하고 크기를 조정하는 데 도움이됩니다.

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


    } 

} 
관련 문제