2015-11-04 27 views
1

所以我正在開發一個Ipad應用程序,允許用戶解決一個拼圖遊戲。我已經爲每件作品制定了平移動作,但是讓它們在我想要的地方工作不正常。當它在一個小範圍內時,我試圖讓它進入最終的目的地,然後是點擊聲。Swift - 拼圖對齊

這是一個拼圖塊的代碼。當我按下新遊戲按鈕時,圖像視圖會被設置爲相應的圖片,並隨機放置在畫布上。

@IBAction func NewGameTapped(sender: UIButton){  
    let bounds = UIScreen.mainScreen().bounds 
    let height = bounds.size.height 
    let width = bounds.size.width 

    image1.image = UIImage(named:"puzzleImage1.png") 
    image1.center.x = CGFloat(100 + arc4random_uniform(UInt32(width)-300)) 
    image1.center.y = CGFloat(100 + arc4random_uniform(UInt32(height)-300)) 

    //Create Panning (Dragging) Gesture Recognizer for Image View 1 
    let panRecognizer1 = UIPanGestureRecognizer(target: self, action: "handlePanning1:") 

    // Add Panning (Dragging) Gesture Recognizer to Image View 1 
    image1.addGestureRecognizer(panRecognizer1) 
} 

這是我遇到一些問題的地方。

func handlePanning1(recognizer: UIPanGestureRecognizer) { 

    let center = dict1_image_coordinates["puzzleImage1"] as![Int] 



    let newTranslation: CGPoint = recognizer.translationInView(image1) 

    recognizer.view?.transform = CGAffineTransformMakeTranslation(lastTranslation1.x + newTranslation.x, lastTranslation1.y + newTranslation.y) 

    if recognizer.state == UIGestureRecognizerState.Ended { 
     lastTranslation1.x += newTranslation.x 
     lastTranslation1.y += newTranslation.y 
    } 

    checkPosition(image1, center: center) 
} 

func checkPosition(image: UIImageView, center: [Int]){ 
    let distance: Double = sqrt(pow((Double(image.center.x) - Double(center[0])),2) + pow((Double(image.center.y) - Double(center[1])),2)) 

    //if the distance is within range, set image to new location. 
    if distance <= 20{ 
     image.center.x = CGFloat(center[0]) 
     image.center.y = CGFloat(center[1]) 

     AudioServicesPlaySystemSound(clickSoundID) 

    } 

無論出於何種原因,拼圖只希望捕捉到這點時,一塊開始接受捕捉距離範圍內的遊戲。我試過檢查我的程序的各個不同部分中的對象位置,但目前爲止沒有任何工作。任何幫助或其他提示,非常感謝。

回答

0

問題可能是由該行

image1.addGestureRecognizer(panRecognizer1) 

通常人們添加gestureRecognizer在parentView,或視圖控制器,而不是圖像1本身的rootView引起的。好處是父視圖永遠不會移動,因爲image1會不斷地被轉換,這可能會影響recognizer.translationInView(x)方法的返回值。

做到這一點,而不是:

self.view.addGestureRecognizer(panRecognizer1) 

,並切換到該行handlePanning1功能:

image1.transform = CGAffineTransformMakeTranslation(lastTranslation1.x + newTranslation.x, lastTranslation1.y + newTranslation.y) 
+0

我忘了提及有需要四處走動許多拼圖,所以當嘗試使用self.view版本,它只註冊最後設置的手勢識別器。 – zhauck

+0

這是很好的zhauck。您可以將同時觸摸的次數設置爲多次。然後使用識別器對象來查找視圖以查看哪個拼圖塊被觸摸 –