2017-01-20 10 views
-1

여러 뷰 컨트롤러가있는 Ipad 게임을 만들었는데, 시작 (ROOT VC에서)에서는 타이머가 2 시간에서부터 카운트 다운됩니다. XCODE 8.2.1/Swift 3에서 실행.UILabel.text를 업데이트하는 타이머로 인해 TouchesBegan/TouchesEnded가 작동하지 않습니다 - 해결 방법은 무엇입니까?

ViewController (6th 또는 7th)의 ViewController에서 사용자가 드래그하여 8 개의 UIImageViews에서 4 개의 다른 UIImageViews (같은 종류의 빈 슬롯)을 통해 TouchesBegan/TouchesMoved/TouchesEnded. (UIImageViews는 Interface Builder에 의해 설정됩니다).

현재 View Controller가로드 될 때 발생하는 타이머를 통해 1 초마다 현재 시간 (2 시간 카운트 다운시)으로 업데이트되는 레이블이 화면 상단에 표시됩니다 (UserInteraction = disabled). (아래 코드에서 showgametimeTimer).

문제 : 이것은 미니 게임을 망칠뿐입니다 (사용자가 손가락으로 드래그를 끝낼 때 이미지가 목적지 위치에 "잠기지 않음").이 ​​"글리치"는 레이블을 업데이트하는 타이머가 실행 중일 때만 발생합니다 .

타이머를 사용하지 않으면 모든 것이 잘 작동하고 예상대로 작동합니다.

그래서 어떤면에서 타이머에서 UILabel.text를 1 초마다 업데이트하면 TouchesBegan 및/또는 TouchesEnded에 영향을주는 것을 호출합니다.

UILabel.text는 화면 상단에 있으며 이동 대상은 하단에 있습니다. 부울 로직을 설정하려고했습니다. 즉, touchesBegan의 시작 부분에 timer.invalidate가 있습니다. TouchesEnded가 끝날 때 타이머를 다시 사용하면 문제가 남아 있습니다.

유일한 방법은이 View Controller에 대해 타이머를 모두 비활성화하는 것입니다.

코드를 추가하는 중입니다. 문제가 실제로 도움이되지 않는다고 생각합니다. 누군가가 동일한 문제에 부딪혔거나 그 원인/해결 방법이 궁금한가요? 초보 프로그래머.

많은 감사

관련 코드 :

var showGameTimeTimer = Timer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     showGameTimeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(showTime), userInfo: nil, repeats: true) 
     showGameTimeTimer.fire() 
    } 

    func showTime(){ 

    TimeLeftLabel.text = gameTimerString // gametimerstring gets updated every second from a timer fired at the Root VC 

    } 

var initialPosi = CGPoint() 
var initialPosiSecond = CGPoint() 
var initialPosiThird = CGPoint() 
var initialPosiFourth = CGPoint() 
var initialPosiFifth = CGPoint() 
var initialPosiSixth = CGPoint() 
var initialPosiSeventh = CGPoint() 
var initialPosiEigth = CGPoint() 
var hasTakenFromFirstSlot = 0 
var hasTakenFromSecondSlot = 0 
var hasTakenFromThirdSlot = 0 
var hasTakenFromFourthSlot = 0 
var imageSelected = 0 
var firstSlotIsTaken = 0 
var secondSlotIsTaken = 0 
var thirdSlotIsTaken = 0 
var fourthSlotIsTaken = 0 
var firstSlotHasImageNumber = 0 
var secondSlotHasImageNumber = 0 
var thirdSlotHasImageNumber = 0 
var fourthSlotHasImageNumber = 0 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in (touches) { 
      let location = touch.location(in: self.view) 



      hasTakenFromFirstSlot = 0 
      hasTakenFromSecondSlot = 0 
      hasTakenFromThirdSlot = 0 
      hasTakenFromFourthSlot = 0 

      if FirstImage.frame.contains(location) { 
       imageSelected = 1 
       FirstImage.center = location 
      } 
      if secondImage.frame.contains(location) { 
       imageSelected = 2 
       secondImage.center = location 
      } 
      if thirdImage.frame.contains(location) { 
       imageSelected = 3 
       thirdImage.center = location 
      } 
      if fourthImage.frame.contains(location) { 
       imageSelected = 4 
       fourthImage.center = location 
      } 
      if fifthImage.frame.contains(location) { 
       imageSelected = 5 
       fifthImage.center = location 
      } 
      if sixthImage.frame.contains(location) { 
       imageSelected = 6 
       sixthImage.center = location 
      } 
      if seventhImage.frame.contains(location) { 
       imageSelected = 7 
       seventhImage.center = location 
      } 
      if eightImage.frame.contains(location) { 
       imageSelected = 8 
       eightImage.center = location 
      } 

      if (FirstImage.frame.contains(location) || secondImage.frame.contains(location) || thirdImage.frame.contains(location) || fourthImage.frame.contains(location) || fifthImage.frame.contains(location) || sixthImage.frame.contains(location) || seventhImage.frame.contains(location) || eightImage.frame.contains(location) ) && firstCorrectImage.frame.contains(location) && firstSlotIsTaken > 0 && firstSlotHasImageNumber > 0 { 
       hasTakenFromFirstSlot = 1 
      } 

      if (FirstImage.frame.contains(location) || secondImage.frame.contains(location) || thirdImage.frame.contains(location) || fourthImage.frame.contains(location) || fifthImage.frame.contains(location) || sixthImage.frame.contains(location) || seventhImage.frame.contains(location) || eightImage.frame.contains(location) ) && secondCorrectImage.frame.contains(location) && secondSlotIsTaken > 0 && secondSlotHasImageNumber > 0 { 
       hasTakenFromSecondSlot = 1 
      } 

      if (FirstImage.frame.contains(location) || secondImage.frame.contains(location) || thirdImage.frame.contains(location) || fourthImage.frame.contains(location) || fifthImage.frame.contains(location) || sixthImage.frame.contains(location) || seventhImage.frame.contains(location) || eightImage.frame.contains(location)) && thirdCorrectImage.frame.contains(location) && thirdSlotHasImageNumber > 0 && thirdSlotIsTaken > 0 { 
       hasTakenFromThirdSlot = 1 
      } 
      if (FirstImage.frame.contains(location) || secondImage.frame.contains(location) || thirdImage.frame.contains(location) || fourthImage.frame.contains(location) || fifthImage.frame.contains(location) || sixthImage.frame.contains(location) || seventhImage.frame.contains(location) || eightImage.frame.contains(location) ) && fourthCorrectImage.frame.contains(location) && fourthSlotIsTaken > 0 && fourthSlotHasImageNumber > 0 { 
       hasTakenFromFourthSlot = 1 
      } 

      if firstCorrectImage.frame.contains(location) && FirstImage.frame.contains(location) == false && secondImage.frame.contains(location) == false && thirdImage.frame.contains(location) == false && fourthImage.frame.contains(location) == false && fifthImage.frame.contains(location) == false && sixthImage.frame.contains(location) == false && seventhImage.frame.contains(location) == false && eightImage.frame.contains(location) == false { 
       firstSlotIsTaken = 0 
      } 
      if secondCorrectImage.frame.contains(location) && FirstImage.frame.contains(location) == false && secondImage.frame.contains(location) == false && thirdImage.frame.contains(location) == false && fourthImage.frame.contains(location) == false && fifthImage.frame.contains(location) == false && sixthImage.frame.contains(location) == false && seventhImage.frame.contains(location) == false && eightImage.frame.contains(location) == false { 
       secondSlotIsTaken = 0 
      } 
      if thirdCorrectImage.frame.contains(location) && FirstImage.frame.contains(location) == false && secondImage.frame.contains(location) == false && thirdImage.frame.contains(location) == false && fourthImage.frame.contains(location) == false && fifthImage.frame.contains(location) == false && sixthImage.frame.contains(location) == false && seventhImage.frame.contains(location) == false && eightImage.frame.contains(location) == false { 
       thirdSlotIsTaken = 0 
      } 
      if fourthCorrectImage.frame.contains(location) && FirstImage.frame.contains(location) == false && secondImage.frame.contains(location) == false && thirdImage.frame.contains(location) == false && fourthImage.frame.contains(location) == false && fifthImage.frame.contains(location) == false && sixthImage.frame.contains(location) == false && seventhImage.frame.contains(location) == false && eightImage.frame.contains(location) == false { 
       fourthSlotIsTaken = 0 
      } 
     } 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in (touches) { 
      let location = touch.location(in: self.view) 

       if imageSelected == 1 { 
       FirstImage.center = location 
      } 
       if imageSelected == 2 { 
       secondImage.center = location 
      } 
      if imageSelected == 3 { 
       thirdImage.center = location 
      } 
      if imageSelected == 4 { 
       fourthImage.center = location 
      } 
      if imageSelected == 5 { 
       fifthImage.center = location 
      } 
      if imageSelected == 6 { 
       sixthImage.center = location 
      } 
      if imageSelected == 7 { 
       seventhImage.center = location 
      } 
      if imageSelected == 8 { 
       eightImage.center = location 
      } 
     } 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in (touches) { 
      let location = touch.location(in: self.view) 

      if firstCorrectImage.frame.contains(location) && firstSlotIsTaken == 0 && hasTakenFromSecondSlot == 0 && hasTakenFromThirdSlot == 0 && hasTakenFromFourthSlot == 0 { 
       if imageSelected > 0 { 
        audioPlayerOne.play() 
       } 
       firstSlotIsTaken = 1 
       if imageSelected == 1 { 
        FirstImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 1 
       } 
       if imageSelected == 2 { 
        secondImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 2} 
       if imageSelected == 3 { 
        thirdImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 3} 
       if imageSelected == 4 { 
        fourthImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 4} 
       if imageSelected == 5 { 
        fifthImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 5} 
       if imageSelected == 6 { 
        sixthImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 6} 
       if imageSelected == 7 { 
        seventhImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 7} 
       if imageSelected == 8 { 
        eightImage.center = firstCorrectImage.center 
        firstSlotHasImageNumber = 8} 

      } else { if secondCorrectImage.frame.contains(location) && secondSlotIsTaken == 0 && hasTakenFromFirstSlot == 0 && hasTakenFromThirdSlot == 0 && hasTakenFromFourthSlot == 0 { 
       if imageSelected > 0 { 
        audioPlayerOne.play() 
       } 
       secondSlotIsTaken = 1 
       if imageSelected == 1 { 
        FirstImage.center = secondCorrectImage.center 
        secondSlotHasImageNumber = 1} 
       if imageSelected == 2 { 
        secondImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 2} 
       if imageSelected == 3 { 
        thirdImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 3} 
       if imageSelected == 4 { 
        fourthImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 4} 
       if imageSelected == 5 { 
        fifthImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 5} 
       if imageSelected == 6 { 
        sixthImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 6} 
       if imageSelected == 7 { 
        seventhImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 7} 
       if imageSelected == 8 { 
        eightImage.center = secondCorrectImage.center 
       secondSlotHasImageNumber = 8} 
      } else { if thirdCorrectImage.frame.contains(location) && thirdSlotIsTaken == 0 && hasTakenFromSecondSlot == 0 && hasTakenFromFirstSlot == 0 && hasTakenFromFourthSlot == 0 { 
       if imageSelected > 0 { 
        audioPlayerOne.play() 
       } 
       thirdSlotIsTaken = 1 
       if imageSelected == 1 { 
        FirstImage.center = thirdCorrectImage.center 
        thirdSlotHasImageNumber = 1} 
       if imageSelected == 2 { 
        secondImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 2} 
       if imageSelected == 3 { 
        thirdImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 3} 
       if imageSelected == 4 { 
        fourthImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 4} 
       if imageSelected == 5 { 
        fifthImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 5} 
       if imageSelected == 6 { 
        sixthImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 6} 
       if imageSelected == 7 { 
        seventhImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 7} 
       if imageSelected == 8 { 
        eightImage.center = thirdCorrectImage.center 
       thirdSlotHasImageNumber = 8} 
      } else { if fourthCorrectImage.frame.contains(location) && fourthSlotIsTaken == 0 && hasTakenFromFirstSlot == 0 && hasTakenFromSecondSlot == 0 && hasTakenFromThirdSlot == 0 { 
       if imageSelected > 0 { 
        audioPlayerOne.play() 
       } 
       fourthSlotIsTaken = 1 
       if imageSelected == 1 { 
        FirstImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 1 
        } 
       if imageSelected == 2 { 
        secondImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 2 
       } 
       if imageSelected == 3 { 
        thirdImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 3 
       } 
       if imageSelected == 4 { 
        fourthImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 4 
       } 
       if imageSelected == 5 { 
        fifthImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 5 
       } 
       if imageSelected == 6 { 
        sixthImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 6 
       } 
       if imageSelected == 7 { 
        seventhImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 7 
       } 
       if imageSelected == 8 { 
        eightImage.center = fourthCorrectImage.center 
        fourthSlotHasImageNumber = 8 
       } 

       } else { 
       UIView.animate(withDuration: 0.2, delay: 0, options: UIViewAnimationOptions(rawValue: UInt(0)), animations: ({ 
        self.audioPlayerTwo.play() 
        if self.hasTakenFromFourthSlot == 1 { 
         self.hasTakenFromFourthSlot = 0 
         self.fourthSlotIsTaken = 0 
         self.fourthSlotHasImageNumber = 0 
        } 
        if self.hasTakenFromThirdSlot == 1 { 
         self.hasTakenFromThirdSlot = 0 
         self.thirdSlotIsTaken = 0 
         self.thirdSlotHasImageNumber = 0 
        } 
        if self.hasTakenFromSecondSlot == 1 { 
         self.hasTakenFromSecondSlot = 0 
         self.secondSlotIsTaken = 0 
         self.secondSlotHasImageNumber = 0 
        } 
        if self.hasTakenFromFirstSlot == 1 { 
         self.hasTakenFromFirstSlot = 0 
         self.firstSlotIsTaken = 0 
         self.firstSlotHasImageNumber = 0 
        } 
        self.getBackToInitialPosi() 
       }), completion: nil) 
      } 

       }}}} 

     if firstSlotHasImageNumber == 0 { 
      firstSlotIsTaken = 0 
     } 
     if secondSlotHasImageNumber == 0 { 
      secondSlotIsTaken = 0 
     } 
     if thirdSlotHasImageNumber == 0 { 
      thirdSlotIsTaken = 0 
     } 
     if fourthSlotHasImageNumber == 0 { 
      fourthSlotIsTaken = 0 
     } 
     imageSelected = 0 



    } 

    func getBackToInitialPosi() { 

     if self.imageSelected == 1 { 
      self.FirstImage.center = self.initialPosi } 
     if self.imageSelected == 2 { 
      self.secondImage.center = self.initialPosiSecond } 
     if self.imageSelected == 3 { 
      self.thirdImage.center = self.initialPosiThird } 
     if self.imageSelected == 4 { 
      self.fourthImage.center = self.initialPosiFourth } 
     if self.imageSelected == 5 { 
      self.fifthImage.center = self.initialPosiFifth } 
     if self.imageSelected == 6 { 
      self.sixthImage.center = self.initialPosiSixth } 
     if self.imageSelected == 7 { 
      self.seventhImage.center = self.initialPosiSeventh } 
     if self.imageSelected == 8 { 
      self.eightImage.center = self.initialPosiEigth } 
     imageSelected = 0 
    } 

    func resetImages() { 
     hasTakenFromFirstSlot = 0 
     hasTakenFromSecondSlot = 0 
     hasTakenFromThirdSlot = 0 
     hasTakenFromFourthSlot = 0 
     imageSelected = 0 
     firstSlotIsTaken = 0 
     secondSlotIsTaken = 0 
     thirdSlotIsTaken = 0 
     fourthSlotIsTaken = 0 
     firstSlotHasImageNumber = 0 
     secondSlotHasImageNumber = 0 
     thirdSlotHasImageNumber = 0 
     fourthSlotHasImageNumber = 0 
    } 

답변

0

이 질문을 다운 투표 한 사람이 문자 그대로 30 초를했던 이유가 명확하게 읽어 보지 않았 때 내가 게시 한 후 이해가 안 돼요 ? 아마도 그러한 사람들이 그런 커뮤니티를 해치지 못하게하는 질문이 게시 된 후 추가 된 멋진 타이머가 있어야합니다.

어쨌든 해결할 수 있었기 때문에 나중에 누군가를 돕기 위해 솔루션을 게시했습니다.

showGameTimeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(showTime), userInfo: nil, repeats: true) 

     RunLoop.main.add(showGameTimeTimer, forMode: RunLoopMode.UITrackingRunLoopMode) 

     showGameTimeTimer.fire() 

    func showTime(){ 
      globalTimeLeftLabel.text = gameTimerString 
    } 

터치가

을 발사하는 동안이 드래그 이미지를 재설정에서 그것을 방지 :

내가해야 할 일을했을 모든

그래서 같은 UITrackingRunLoopMode와 UILabel의 업데이트 타이머를 추가했다