Swift: создание нескольких копий UIImageView по пути touchesMoved
Я новичок в Swift и играю с этим кодом весь день. Я думаю, что знаю, где проблема, но я не совсем уверен, как ее решить. У меня есть контроллер представления, который содержит UIImageView, и я просто хочу сделать несколько копий одного и того же UIImageView в каждой точке касания, когда пользователь входит в функцию touchesMoved. Я создал массив для хранения элементов всех мест, к которым пользователь прикоснулся, и использовал array.append в функции touchesMoved для сбора точек. Затем я создал цикл, который будет читать эти CGPoints и назначать UIImageView точке. Проблема в том, что CGPoints не конвертируются в UIImageViews. Любые предложения о том, как я могу решить эту проблему?
import UIKit
import CoreGraphics
class ViewController: UIViewController {
var wayPoints: [CGPoint] = []
var location = CGPoint(x: 0, y: 0)
@IBOutlet var Person : UIImageView!
func movePoint (){
for var i = 0; i < wayPoints.count; ++i {
let p = wayPoints[i]
if i == 0 {
CGPointMake(p.x, p.y)
}
else {
CGPointMake(p.x, p.y)
}
var Person = wayPoints[i]
}
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
var touch : UITouch! = touches.anyObject() as UITouch
location = touch.locationInView(self.view)
Person.center = location
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
var touch : UITouch! = touches.anyObject() as UITouch
location = touch.locationInView(self.view)
Person.center = location
wayPoints.append(location)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
Person.center = CGPointMake(0, 0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
[редактировать]
Это немного другой подход с использованием CALayer. Я использовал его, потому что: 1. Я обнаружил, что копии UIImageView означали бы низкую производительность, и 2. для каждых пяти копий слоя, которые я делаю, я хочу иметь возможность анимировать contentScale слоя на 120%. Я понимаю, что сейчас анимация предназначена для cornerRadius, но это единственная анимация, которая мне нужна. Синтаксис в порядке, но я думаю, что моя семантика все еще немного не в порядке. Изображение следует за моим курсором, пока я перетаскиваю, и я думаю, что слои создаются, потому что в следе есть небольшая задержка. Я просто не могу заставить изображения заполнять слои, чтобы фактически сформировать путь, по которому тащился пользователь. Буду признателен за помощь, пока я пытаюсь этот новый подход.
import UIKit
import QuartzCore
class ViewController: UIViewController {
let imageLayer = CALayer()
let image = UIImage(named: "at")!
var wayPoints: [CGPoint] = []
var layers: [CALayer] = []
var images: [UIImage] = []
var location = CGPoint(x: 0, y: 0)
override func viewDidLoad() {
super.viewDidLoad()
}
func setup() {
imageLayer.contents = image.CGImage
imageLayer.frame = CGRect(x: 50, y: 50, width: 50, height: 50)
imageLayer.backgroundColor = UIColor.redColor().CGColor
// Round corners
imageLayer.cornerRadius = 25
// Set border
imageLayer.borderColor = UIColor.blackColor().CGColor
imageLayer.borderWidth = 10
imageLayer.shadowColor = UIColor.blackColor().CGColor
imageLayer.shadowOpacity = 0.8
imageLayer.shadowOffset = CGSizeMake(2, 2)
imageLayer.shadowRadius = 3
imageLayer.frame = CGRect(x: 0, y: 100, width: 200, height: 200)
imageLayer.contentsGravity = kCAGravityResizeAspect
imageLayer.contentsScale = imageLayer.contentsScale
self.view.layer.addSublayer(imageLayer)
for var i = 0; i < wayPoints.count; ++i {
let p = wayPoints[i]
if i == 0 {
CGPointMake(p.x, p.y)
}
else {
CGPointMake(p.x, p.y)
}
var newLayer = CALayer()
newLayer.position = wayPoints[i]
var newImage = UIImage(named: "at")!
newLayer.contents = newImage.CGImage
layers.append(newLayer)
images.append(newImage)
}
}
// Animate button would trigger this function to fire
func animate(){
for (index, value) in enumerate(layers){
if index % 5 == 0 {
let animation = CABasicAnimation(keyPath: "cornerRadius")
animation.fromValue = value.cornerRadius
animation.toValue = 0
animation.repeatCount = 1000
imageLayer.addAnimation(animation, forKey: "cornerRadius")
}
else {
let animation = CABasicAnimation(keyPath: "cornerRadius")
animation.fromValue = value.cornerRadius
animation.toValue = 25
animation.repeatCount = 1000
imageLayer.addAnimation(animation, forKey: "cornerRadius")
}
}
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
var touch : UITouch! = touches.anyObject() as UITouch
location = touch.locationInView(self.view)
imageLayer.position = location
setup()
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
var touch : UITouch! = touches.anyObject() as UITouch
// var point: CGPoint = touches.anyObject() as UITouch
location = touch.locationInView(self.view)
wayPoints.append(location)
setup()
imageLayer.position = location
}
}
2 ответа
Удалить var Person = waypoints[i]
и замените его на что-то вроде:
for (n, child) in enumerate(containerView.subviews) {
(child as UIView).removeFromSuperview()
}
var newPerson = UIImageView(image: Person.image)
newPerson.position = waypoints[i]
containerView.addSubview(newPerson)
куда containerView
это UIView, который вы настроили с целью хранения ваших изображений.
В качестве примечания: пожалуйста, не называйте свои переменные именами UpperCase, они должны быть зарезервированы для типов (протоколы классов, структуры и т. Д.)
Похоже, вы перемещаете существующее изображение, а не создаете новые.
Делайте то, что сказал @joshua, но убедитесь, что вы вызываете свой метод movePoint() внутри touchesMoved(). Теперь это никогда не вызывается.
В качестве примечания, в зависимости от используемого вами изображения и других контекстно-зависимых переменных, то, что вы пытаетесь сделать, может привести к "медленному / медленному" результату.