저는 신속하고 처음부터이 코드로 놀아 왔습니다. 문제가 어디 있는지 알 것 같지만 문제를 해결하는 방법을 잘 모릅니다. UIImageView가 포함 된 뷰 컨트롤러가 있고 사용자가 touchesMoved 함수를 입력 할 때 각 터치 포인트에서 동일한 UIImageView의 여러 복사본을 만들려고합니다. 사용자가 터치 한 모든 위치의 요소를 저장하기위한 배열을 생성하고 touchesMoved 함수에서 array.append를 사용하여 점을 수집했습니다. 그런 다음이 CGPoints를 읽고 그 지점에 UIImageView를 할당하는 루프를 만들었습니다. 문제는 CGPoint가 UIImageView로 변환 할 수 없다는 것입니다. 이 문제를 어떻게 해결할 수 있을지에 대한 제안이 있으십니까?스위프트 : touchesMoved 경로를 따라 여러 UIImageView 복사본 만들기
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을 사용하여 약간 다른 방식이다. 왜냐하면 나는 UIImageView 복사본이 성능이 좋지 않다는 것을 알았 기 때문입니다. 2. 5 개 레이어를 복사 할 때마다 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
}
}
당신의 self.view에 그것을 추가하는 것을 잊지 마십시오 – Eyeball
좋은 캐치, 안구! –
내 코드는 UIImage에 'position'이라는 멤버가 없다는 경고를 표시합니다. 어떤 해결책? 아니면 CALayers를 사용하여 전체 문제에 접근해야합니까 (개별 레이어에 애니메이션 효과를 적용하려는 경우)? – Beatle