Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使新图像视图可移动?_Ios_Swift_Uicollectionview - Fatal编程技术网

Ios 如何使新图像视图可移动?

Ios 如何使新图像视图可移动?,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我一直在尝试拼凑一个项目,其中包含一个侧面滚动的集合视图,当点击一个单元格时,它将向场景添加一个新的图像视图。我想这个新的形象是拖拉 我的代码当前显示收藏视图,点击时会添加一个新图像,我称之为贴纸 我还没有完全弄清楚如何让它放置正确的标签,但我的第一个目标是确保出现的东西可以移动 import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

我一直在尝试拼凑一个项目,其中包含一个侧面滚动的集合视图,当点击一个单元格时,它将向场景添加一个新的图像视图。我想这个新的形象是拖拉

我的代码当前显示收藏视图,点击时会添加一个新图像,我称之为贴纸

我还没有完全弄清楚如何让它放置正确的标签,但我的第一个目标是确保出现的东西可以移动

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    @IBOutlet weak var collectionView: UICollectionView!

    let stickers: [UIImage] = [
        UIImage(named: "cow")!,
        UIImage(named: "chicken")!,
        UIImage(named: "pig")!,
        UIImage(named: "cow")!,
        UIImage(named: "chicken")!,
        UIImage(named: "pig")!,
        UIImage(named: "cow")!,
        UIImage(named: "chicken")!,
        UIImage(named: "pig")!,
    ]

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return stickers.count
    }

    var activeSticker = UIImage(named: "cow")

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        cell.stickerImage.image = stickers[indexPath.item]
        cell.backgroundColor = UIColor(white: 1, alpha: 0.9)
        cell.translatesAutoresizingMaskIntoConstraints = false
        cell.contentMode = .scaleAspectFill
        cell.clipsToBounds = true
        cell.layer.cornerRadius = 7
        let addSticker = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        addSticker.addTarget(self, action: #selector(addStickerTapped), for: UIControl.Event.touchUpInside)
        activeSticker = cell.stickerImage.image
        cell.addSubview(addSticker)
        return cell
    }    

    @IBAction func addStickerTapped() -> Void {
        print("Hello Sticker Button")
        let image = activeSticker //UIImage(named: imageName)
        let imageView = UIImageView(image: image!)
        imageView.frame = CGRect(x: 100, y: 100, width: 100, height: 200)
        imageView.contentMode = .scaleAspectFit
        imageView.isUserInteractionEnabled = true
        self.view.addSubview(imageView)
        //Imageview on Top of View
        self.view.bringSubviewToFront(imageView)
    }
}
要在self.view内移动imageView,可以使用UIPangestureRecognitor。例如,在viewDidLoad中添加手势识别器:


查看苹果公司的文档以了解Hi。你能在这里澄清你的主要问题吗?我不明白你说的确保出现的东西可以移动是什么意思。你到底想移动什么?为什么需要移动它?当点击一个单元格时,它会向场景中添加一个新图像。我希望用户能够拖动新的图像左右。场景基本上是一个农场,所有的细胞都是不同的动物。你可以将它们添加到农场,并将它们拖动到任何你喜欢的地方。将平移手势识别器拖动到imageView,然后你可以移动它的frame.center.x和frame.center.y,通过从手势识别器获得的位置更改。我可以让它与你的输入一起工作,谢谢!我必须做的一个编辑是将这一行:sender.setTranslation0.0,in:self.view改为:sender.setTranslationCGPoint.zero,in:self.view是的,很抱歉。应该使用。0而不是0.0。
class ViewController: UIViewController {

    var selectedImageView: UIImageView?

    override func viewDidLoad() {
        super.viewDidLoad()
        addPanGestureRecognizer()
    }

    func addPanGestureRecognizer() {
        let pan = UIPanGestureRecognizer(target: self, action: #selector(moveImageView(_:)))
        // set up and optimize pan gesture options here if you need to
        self.view.addGestureRecognizer(pan)
    }

    @objc func moveImageView(_ sender: UIPanGestureRecognizer) {
        // assign one of your image views to selectedImageView to ensure you only move one image view at a time
        // for example in func addStickerTapped() you could assign selectedImageView = imageView

        guard let selectedImageView = selectedImageView else {
            return
        }

        switch sender.state {
        case .changed, .ended:
            selectedImageView.center = selectedImageView.center.offset(by: sender.translation(in: self.view))
            sender.setTranslation(.zero, in: self.view)
        default:
            break
        }
    }
}

extension CGPoint {
    func offset(by point: CGPoint) -> CGPoint {
        return CGPoint(x: self.x + point.x, y: self.y + point.y)
    }
}