SWIFT:将 CGPoint 与数组中的图像相关联

Posted

技术标签:

【中文标题】SWIFT:将 CGPoint 与数组中的图像相关联【英文标题】:SWIFT: Associate CGPoint with image from array 【发布时间】:2016-08-24 20:23:18 【问题描述】:

我有一个程序,其中循环收集出口,以便为每个图像提供一个 CGpoint 以确定其原点位置并对每个图像应用平移手势。

但是,我的问题是,当平移手势结束时,图片应该回到最初确定的原始位置。但是当我这样做时,

if sender.state == UIGestureRecognizerState.Ended 

                for image in imageCollection 
                    image.center = positionOrigin
                

图像移回与其他图像不同的位置/相同的位置。 我想这是因为我没有通过索引将 CGPoint 原点与每个图像相关联(例如,使用字典有意义吗?)。 有人知道如何解决这个问题吗?

这是我的代码:

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate 

    @IBOutlet var imageCollection: [UIImageView]!

    var positionOrigin: CGPoint!

    override func viewDidLoad() 
        super.viewDidLoad()

        for image in imageCollection 
            positionOrigin = image.center
            let recognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan))
            recognizer.delegate = self
            image.addGestureRecognizer(recognizer)
        
  
     func handlePan(sender:UIPanGestureRecognizer) 

        let translation = sender.translationInView(self.view)

        if let view = sender.view 
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y)
            sender.setTranslation(CGPointZero, inView: self.view)
        
        if sender.state == UIGestureRecognizerState.Ended 

            for image in imageCollection 
                image.center = positionOrigin
            
        
    

【问题讨论】:

【参考方案1】:

这部分是问题var positionOrigin: CGPoint! 它是循环中的值变化,所以最后它只有最后一个图像位置, 您可以使用具有 positionOrigin 属性的图像子类或使用 positionOrigin 数组来保存每个图像的原点位置。

【讨论】:

是的,我已经尝试使 CGPoint 成为一个数组并遍历它们,但不知何故我被卡住了。我总是在附加图像位置的行中收到错误消息“线程 1:EXC_BAD_INSTRUCTION”。 @IBOutlet var imageCollection: [UIImageView]! var originPositions: [CGPoint]! override func viewDidLoad() super.viewDidLoad() for image in imageCollection var i = 0 originPositions.append(imageCollection[i].center) i+=1 [...] 试试这样: var originPositions=[CGPoint]() override func viewDidLoad() super.viewDidLoad() for image in imageCollection originPositions.append(image.center) 哈!现在它可以按预期顺利运行。伟大的!非常感谢! 很高兴听到这个消息:-)【参考方案2】:

在@Dasem 的帮助下,我能够想出以下问题的答案:

将 originPositions 设为数组,将位置值附加到 originPositions 数组在使用 for 循环移动时带回图像 使用索引

ViewController.swift

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate 

    @IBOutlet var imageCollection: [UIImageView]!
    var originPositions=[CGPoint]()

    override func viewDidLoad() 
        super.viewDidLoad()

        for image in imageCollection 

            originPositions.append(image.center)

            print(originPositions)

            let recognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan))
            recognizer.delegate = self
            image.addGestureRecognizer(recognizer)

        

    

     func handlePan(sender:UIPanGestureRecognizer) 

        let translation = sender.translationInView(self.view)

        if let view = sender.view 
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y)
            sender.setTranslation(CGPointZero, inView: self.view)
        
        if sender.state == UIGestureRecognizerState.Ended 

            for i in 0 ..< imageCollection.count 
                imageCollection[i].center = originPositions[i]
            
        
    

【讨论】:

以上是关于SWIFT:将 CGPoint 与数组中的图像相关联的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误转换点(CGPoint,到:UITableView)

Swift 中的 CIDetector 透视和裁剪

Swift 数组

如何将数组中的非静态图像加载到 Swift 中的集合视图中

Swift NSTimer 将 userInfo 检索为 CGPoint

SWIFT - UIimagepicker 将图像分配到数组中