2015-02-04 3 views
0

저는 신속하고 처음부터이 코드로 놀아 왔습니다. 문제가 어디 있는지 알 것 같지만 문제를 해결하는 방법을 잘 모릅니다. 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 

} 

}

답변

1

var Person = waypoints[i] 선을 제거하고 같은로 대체 : containerView 당신이 당신의 이미지 뷰를 포함하기위한 목적으로 설정 UIView의이

for (n, child) in enumerate(containerView.subviews) { 
    (child as UIView).removeFromSuperview() 
} 
var newPerson = UIImageView(image: Person.image) 
newPerson.position = waypoints[i] 
containerView.addSubview(newPerson) 

. 보조 노트로

: 대문자 이름을 사용하여 변수의 이름을하지 마십시오는 그가 (클래스 프로토콜, 구조체 등)

+1

당신의 self.view에 그것을 추가하는 것을 잊지 마십시오 – Eyeball

+1

좋은 캐치, 안구! –

+0

내 코드는 UIImage에 'position'이라는 멤버가 없다는 경고를 표시합니다. 어떤 해결책? 아니면 CALayers를 사용하여 전체 문제에 접근해야합니까 (개별 레이어에 애니메이션 효과를 적용하려는 경우)? – Beatle

0

그것은 당신이 만드는 것보다 기존의 이미지를 이동하는 더 보이는 유형에 예약해야한다 새 것.

@joshua는 실제로 touchesMoved()에서 movePoint() 메서드를 호출했는지 확인합니다. 이제는 결코 부르지 않습니다.

보조 메모로 사용중인 이미지 및 기타 컨텍스트 종속 변수에 따라 수행하려는 작업이 "느린/느린"결과를 생성 할 수 있습니다.

+0

동의합니다 ... 제 솔루션은 이해하기 쉽지만 까다로운 성능을 발휘합니다. QuartzCore를 사용하고 이미지를 "캔버스"이미지에 반복적으로 묘화하는 것이 더 좋습니다. –

+0

CGLayer 객체를 사용하면 성능/그리기 시간이 향상 될 가능성이 높습니다. 그렇지 않습니까? Apple의 문서에 따르면 CGLayerRef는 "반복되는 그리기"에 적합합니다. 예를 들어 반복해서 그려지는 동일한 항목으로 구성된 패턴을 만듭니다. " 그것이 성능상의 이유로 모든 사람들이 권장하는 것이므로, 일부 코드를 다시 작성하고 다른 방법으로 수행 할 수 없는지 확인해 보겠습니다. 감사. – Beatle