swift - 使用 UIPanGestureRecognizer 拖动 CGRect

标签 swift uigesturerecognizer drag uipangesturerecognizer cgrect

我正在对 UIView 进行子类化,并尝试在屏幕上来回“拖动”CGRect。基本上我每次拖动手指时都想移动(重绘)矩形。到目前为止,我有这段代码:

var rectangle: CGRect {
    get {
        return CGRect(x: 200,
                    y: 200,
                    width: frame.width / 6,
                    height: 15)
    }

    set {}
}

override func draw(_ rect: CGRect) {
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(dragRectangle(recognizer:)))
    addGestureRecognizer(gesture)
    drawRectangle(rect)
}

func drawRectangle(_ rect: CGRect) {
    let path = UIBezierPath(rect: rectangle)
    UIColor.black.set()
    path.fill()
}

@objc func dragRectangle(recognizer: UIPanGestureRecognizer) {
    let translation = recognizer.translation(in: self)
    rectangle = CGRect(x: rectangle.midX + translation.x, y: rectangle.midY + translation.y, width: rectangle.width, height: rectangle.height)
    setNeedsDisplay()
    recognizer.setTranslation(CGPoint.zero, in: self)
}

这是我第一次使用 UIPanGestureRecognizer,所以我不确定其中的所有细节。我在 drawRectangle 中设置了断点并确认它正在被调用。但是,无论我尝试拖动它多少次,屏幕上的矩形都不会移动。怎么了?

最佳答案

This is how you can do it easily. just copy paste and run this.

//
//  RootController.swift
//  SampleApp
//
//  Created by Chanaka Caldera on 24/6/19.
//  Copyright © 2019 homeapps. All rights reserved.
//

import UIKit

class RootController: UIViewController {

    private var draggableView: UIView!
    private var pangesture: UIPanGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()

        setdragview()

    }
}

extension RootController {
    fileprivate func setdragview() {
        draggableView = UIView()
        draggableView.translatesAutoresizingMaskIntoConstraints = false
        draggableView.backgroundColor = .lightGray
        view.addSubview(draggableView)

        let draggableviewConstraints = [draggableView.leftAnchor.constraint(equalTo: view.leftAnchor,constant: 10),
                                        draggableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 64),
                                        draggableView.widthAnchor.constraint(equalToConstant: 100),
                                        draggableView.heightAnchor.constraint(equalToConstant: 40)]

        NSLayoutConstraint.activate(draggableviewConstraints)

        pangesture = UIPanGestureRecognizer()
        draggableView.isUserInteractionEnabled = true
        draggableView.addGestureRecognizer(pangesture)
        pangesture.addTarget(self, action: #selector(draggableFunction(_:)))

    }
}

extension RootController {
    @objc fileprivate func draggableFunction(_ sender: UIPanGestureRecognizer) {
        view.bringSubviewToFront(draggableView)
        let translation = sender.translation(in: self.view)
        draggableView.center = CGPoint(x: draggableView.center.x + translation.x, y: draggableView.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: self.view)
        print("drag works : \(translation.x)")
    }
}

这是演示,

enter image description here

希望这会有所帮助。干杯!

关于swift - 使用 UIPanGestureRecognizer 拖动 CGRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56729165/

相关文章:

ios - View 中的手势识别器并使用 View Controller 作为目标,我的设计是否错误?

ios - 更新永远快速重复的 SKAction 的参数

ios - 为什么我的约束在 iphone 5 和 iphone 6 上运行应用程序时使布局不同?

ios - 以编程方式全屏打开 iframe 视频

android - 使用 setDefaultUncaughtExceptionHandler (reportDropResult) 捕获未处理的异常时线程卡住

ios - 对于 iOS,如何在按钮内创建可拖动按钮?

android - 触摸时拖动图像

ios - 如何快速将自定义 PFUser 字段从 Parse 拉入 UILabel?

ios - 将按钮添加到单元格

ios - 一定时间后取消 UILongPressGestureRecognizer