【问题标题】:snapchat-like pinch zoom on iOSiOS 上类似 snapchat 的捏缩放
【发布时间】:2016-06-15 20:27:00
【问题描述】:

我在 swift 中发布了 iOS 应用程序,其主要功能是: 1)添加照片/拍照 2)在照片上添加表情符号 3)缩放,旋转,拖动表情符号来装饰照片 4) 在 Instagram 上分享。

表情符号可以旋转、缩放和拖动。我使用 UIGestureRecognizer 实现了这些功能,例如 UIRoationGestrueRecognizer、UIPinchGestureRecognizer 和 UIPanGestureRecognizer。

现在我正在尝试使用类似 snapchat 的捏缩放功能更新应用程序,用户可以将两个手指之间的表情符号放大/缩小到极致。当前的捏合手势仅在用户的手指在 imageView(表情符号)上时才有效。

任何想法/示例代码如何进行类似 snapchat 的捏缩放?下面的代码是我如何处理旋转、捏合和拖动。提前致谢。

// UI Gesture Recognizers
@IBAction func handlePinch(recognizer : UIPinchGestureRecognizer) {
    if(deleteMode) {
        return
    }
    if let view = recognizer.view {
        view.transform = CGAffineTransformScale(view.transform,
            recognizer.scale, recognizer.scale)
        recognizer.scale = 1
    }
}

@IBAction func handleRotate(recognizer : UIRotationGestureRecognizer) {
    if(deleteMode) {
        return
    }
    if let view = recognizer.view {
        view.transform = CGAffineTransformRotate(view.transform, recognizer.rotation)
        recognizer.rotation = 0
    }
}

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
    if(deleteMode) {
        return
    }
    let translation = recognizer.translationInView(self.view)
    var centerX: CGFloat!
    var centerY: CGFloat!

    if let view = recognizer.view {

        // limit the boundary - using backgroundPanel.frame.width, height, origin.x, origin.y
        if(view.center.x + translation.x < panelBackground.frame.origin.x) {
            centerX = view.center.x + translation.x + 10
        } else if(view.center.x > panelBackground.frame.size.width){
            centerX = view.center.x + translation.x - 10
        } else {
            centerX = view.center.x + translation.x
        }

        if(view.center.y < panelBackground.frame.origin.y - 60){
            // set y that I can use below
            centerY = view.center.y + translation.y + 10
        } else if(view.center.y > panelBackground.frame.size.height){
            centerY = view.center.y + translation.y - 10
        } else {
            centerY = view.center.y + translation.y
        }

        // set final position
        view.center = CGPoint(x:centerX,
            y:centerY)

        recognizer.setTranslation(CGPointZero, inView: self.view)

    }
}

@IBAction func handleLongPress(recognizer: UILongPressGestureRecognizer) {
    if(recognizer.state == UIGestureRecognizerState.Began) {
        if(!deleteMode) {
            print("LongPress - Delete Shows")
            for (_, stickers) in self.backgroundImage.subviews.enumerate() {
                for (_, deleteButtons) in stickers.subviews.enumerate() {
                    if let delete:UIImageView = deleteButtons as? UIImageView{
                        if(delete.accessibilityIdentifier == "delete") {
                            delete.alpha = 0.5
                        }
                    }
                }
            }
            deleteMode = true
        } else {
            deleteButtonHides()
        }
    }
}

【问题讨论】:

  • 从现在开始你应该怎么做????先搜索再问
  • @MuhammadRaheelMateen 我搜索了很多,但找不到任何类似 snapchat 的快速缩放示例。如果您能找到一份,请提供一份。

标签: ios swift pinch snapchat


【解决方案1】:

我也在寻找像 snapchat 一样的拖动、平移和缩放功能,但如果您只是在寻找缩放功能。我正在使用以下功能让标签通过捏合进行缩放。它不流畅,但可以进行缩放工作。

  func handlePinch(recognizer: UIPinchGestureRecognizer) {
    if let view = recognizer.view as? UILabel {
        let pinchScale: CGFloat = recognizer.scale
        view.transform = view.transform.scaledBy(x: pinchScale, y: pinchScale)
        recognizer.scale = 1.0
    }
}

要同时拖动、平移和缩放,请查看我的以下帖子:

Pinch, drag and pan at the same time

【讨论】:

    【解决方案2】:

    要实现像捏缩放这样的 snapchat,还要在父视图上添加捏手势,而不是识别器转换选定的贴纸,如下所示:

    @objc func mainImgPinchGesture(_ recognizer: UIPinchGestureRecognizer) {
           print("----pinchGestureAction")
           if let view = recognizer.view {
            if selectedSubView != nil{
                self.selectedSubView.transform = view.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
                self.selectedSubView.contentScaleFactor = 1
             }
           }
       }
    

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2019-05-26
      • 2023-03-28
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多