SWIFT: 将 CGPoint 与数组中的图像相关联
SWIFT: Associate CGPoint with image from array
我有一个程序,其中循环收集出口以便为每个图像提供一个 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
}
}
}
}
这部分是问题var positionOrigin: CGPoint!
它是循环中的值变化,所以最后,它只有最后一个图像位置,
您可以使用图像的子类 属性 positionOrigin 或使用 positionOrigin 数组来保存每个图像的原点位置。
在@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]
}
}
}
}
我有一个程序,其中循环收集出口以便为每个图像提供一个 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
}
}
}
}
这部分是问题var positionOrigin: CGPoint!
它是循环中的值变化,所以最后,它只有最后一个图像位置,
您可以使用图像的子类 属性 positionOrigin 或使用 positionOrigin 数组来保存每个图像的原点位置。
在@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]
}
}
}
}