2015-11-04 2 views
1

Итак, я разрабатываю приложение Ipad, которое позволяет пользователю решать головоломку. Я разработал процесс панорамирования для каждой части, но получить их там, где я хочу, не работал должным образом. Я пытаюсь сделать фрагмент в конечном месте, когда он находится в небольшом диапазоне, за которым следует щелчок.Swift - Jigsaw Snap to Place

Вот немного кода для одной части головоломки. Когда моя новая кнопка игры нажата, изображение будет установлено на соответствующее изображение и случайно помещено на холст.

@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, или rootView контроллера представления вместо самого image1. Преимущество заключается в том, что parentView никогда не перемещается, где, когда изображение1 постоянно преобразуется, что может или не может повлиять на возвращаемое значение метода recognizer.translationInView(x).

сделать это вместо:

self.view.addGestureRecognizer(panRecognizer1) 

и изменения в этой линии в handlePanning1 функции:

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

Я забыл упомянуть, есть много частей головоломки, которые должны быть перемещены, так что, когда пытались использовать версия self.view, она только зарегистрировала последний признак распознавания жестов. – zhauck

+0

Это прекрасно жаук. Вы можете установить количество одновременных касаний более чем на один. Затем используйте объект распознавателя, чтобы найти вид, чтобы увидеть, какая часть головоломки была затронута –