我是swift的新手,整天都在使用这段代码。我想我知道问题在哪里,但我不太清楚如何解决它。我有一个包含UIImageView的视图控制器,我希望在用户输入touchesMoved函数时,在每个触摸点简单地制作相同UIImageView的多个副本。我创建了一个数组来存储用户触摸的所有位置的元素,并在touchesMoved函数中使用array.append来收集点。然后我创建了一个循环,它将读取这些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副本意味着性能不佳,而且我每制作五层副本,我希望能够将图层的contentsScale设置为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
}
}
答案 0 :(得分:1)
删除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名称命名变量,这些变量应保留用于类型(类协议,结构等)
答案 1 :(得分:0)
看起来更像是移动现有图像而不是创建新图像。
做@joshua所说的但确保你实际上在touchesMoved()中调用你的movePoint()方法。现在它永远不会被召唤。
作为旁注,根据您使用的图像和其他依赖于上下文的变量,您尝试执行的操作可能会产生“缓慢/缓慢”的结果。