ios - Swift:沿 touchesMoved 路径创建多个 UIImageView 副本

标签 ios swift uiimageview touchesmoved

我是 swift 的新手,一整天都在研究这段代码。我想我知道问题出在哪里,但我不太确定如何解决。我有一个包含 UIImageView 的 View Controller ,我希望在用户输入 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 副本意味着性能不佳 2. 对于我制作的每五层副本,我希望能够将图层的 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

}

最佳答案

删除 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 是您为包含 ImageView 而设置的 UIView。

作为旁注:请不要使用大写名称命名变量,这些名称应保留用于类型(类协议(protocol)、结构等)

关于ios - Swift:沿 touchesMoved 路径创建多个 UIImageView 副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28313301/

相关文章:

swift - PromiseKit - 返回嵌套的 promise

ios - 具有倍增效果的 Swift UIView

ios - 使用径向动画显示 UIImage

ios - SwiftUI 使用导航链接从模态表过渡到常规 View

ios - 在 swift IOS 中使代码更有条理

iphone - Javascript和 objective-c

ios - SpriteKit : SKShapeNodes overlapping

ios - rawValue 属性在哪里?

ios - 自定义表格 View 单元格中的 ImageView 在触摸或滚动后意外调整大小

ios - 来自 JSON 的字典中的键