2017-01-29 3 views
1

Я не уверен, было ли это задано или нет, но мне не удалось найти решение. Я реализую жест панорамирования на кнопке, но идея такова: кнопка закреплена на позиции, а когда пользователь ее перетаскивает, копия кнопки создается и перемещается с жестом; первоначальный находится в своем первоначальном месте (так что в представлении будут две кнопки). Когда панорамирование заканчивается, новая кнопка используется для некоторой обработки, и после этого она должна исчезнуть (исходная остается такой, как есть, поэтому весь этот процесс может повторяться). В настоящее время то, что у меня есть:iOS: перетаскивание копии кнопки

private func addPanGesture() { 
    for btn in self.selectors { //selectors is a list of buttons which needs this gesture 
     let pan = UIPanGestureRecognizer(target: self, action:#selector(self.panDetected(_:))) 
     pan.minimumNumberOfTouches = 1 
     pan.maximumNumberOfTouches = 1 
     btn.addGesturerecognizer(pan) 
    } 
} 

@objc private func panDetected(_ panGesture: UIPanGestureRecognizer) { 
    var translation = panGesture.translation(in: view) 
    panGesture.setTranslation(CGPoint(x: 0, y: 0), in: view) 

    var newButton = UIButton() 
    if let initButton = panGesture.view as? UIButton { 
     print ("Button recognized!") // this msg is printed out 
     newButton.center = CGPoint(x: initButton.center.x + translation.x, y: initButton.center.y + translation.y) 
     newButton.setImage(UIImage(named: "somename"), for: .normal) 
    } 

    if panGesture.state == UIGestureRecognizerState.began { 
     self.view.addSubview(newButton) 
    } 
    if panGesture.state == UIGestureRecognizerState.ended { 
     //some other processing 
    } 
    if panGesture.state == UIGestureRecognizerState.changed { 
     self.view.addSubview(newButton) 
    } 
    // printed-out msgs show began, ended, changed states have all been reached 
} 

Но новая кнопка не отображается на мой взгляд. Могу ли я узнать, как это решить?

ответ

0
  1. Вам нужно создать и добавить новую кнопку как подвид только на .began и удалить его на .ended.
  2. Поэтому вам нужно сохранить ссылку на новую кнопку.
  3. Вы устанавливаете центр новой кнопки, но не размер. Вы можете установить его .frame.
  4. Вам не нужно устанавливать перевод на жесты панорамирования. Когда вы получите var translation = panGesture.translation(in: view), вы получите все, что вам нужно.
  5. я написал ниже код только для одной кнопки, но если вы собираетесь разрешить одновременное перетаскивание кнопок, вам нужно будет держать список движущихся кнопок вместо var movingButton: UIButton?

    private func addPanGesture() { 
         let pan = UIPanGestureRecognizer(target: self, action:#selector(self.panDetected(_:))) 
         pan.minimumNumberOfTouches = 1 
         pan.maximumNumberOfTouches = 1 
         btn.addGestureRecognizer(pan) 
        } 
    
        @objc private func panDetected(_ panGesture: UIPanGestureRecognizer) { 
         let translation = panGesture.translation(in: view) 
    
         let initButton = panGesture.view as! UIButton 
    
    
         if panGesture.state == UIGestureRecognizerState.began { 
          // this is just copying initial button 
          // this might be overkill 
          // just make sure you set the frame, title and image of the new button correctly 
          let initButtonData = NSKeyedArchiver.archivedData(withRootObject: initButton) 
          let newButton = NSKeyedUnarchiver.unarchiveObject(with: initButtonData) as! UIButton 
    
          // we store new button's reference since we will just move it while it is added to view 
          movingButton = newButton 
          self.view.addSubview(movingButton!) 
    
         } 
         if panGesture.state == UIGestureRecognizerState.ended { 
          //some other processing 
    
          // when we are done just we just remove it from superview 
          movingButton!.removeFromSuperview() 
         } 
         if panGesture.state == UIGestureRecognizerState.changed { 
    
          // at any change, all we need to do is update movingButton's frame 
          var buttonFrame = initButton.frame; 
          buttonFrame.origin = CGPoint(x: buttonFrame.origin.x + translation.x, y: buttonFrame.origin.y + translation.y) 
          movingButton!.frame = buttonFrame 
         } 
        } 
    
0

Трудно сказать без отладки, но несколько вещей, которые я вижу:

Вы создаете новую кнопку каждый раз, когда через panDetected, и добавить его к виду каждый раз. Вы должны создать только кнопку добавления в состоянии .began.

Чтобы создать свою кнопку, вы должны использовать init(frame:) и инициализировать ее до размера изображения.

Похоже, вы прикрепляете жесты к кнопкам. Затем вы получаете координаты панорамы в системе координат кнопки, что не имеет смысла. Вы должны преобразовать жест панорамы в систему координат супервизора кнопки и не должны вызывать setTranslation, за исключением случаев, когда состояние жесткости панорамирования равно .began.

Вы должны устанавливать координаты кнопки в новое место жесты панорамирования каждый раз, когда вы получаете сообщение 1st.changed.

Смежные вопросы