2017-10-23 10 views
0

팬 제스처로 이동 한 후 UIStackView의 요소를 가져 오거나 유지하려고합니다.UIStackView & Gestures

예를 들어, 핸들을 잡으려고하는 요소는 버튼 태그 또는 텍스트 레이블 텍스트와 같은 것입니다. 그것은 버튼 및 텍스트 레이블을 포함하는 기능 func createButtonStack(label: String, btnTag: Int) -> UIStackView

를 통해

코드 설명 ...

나는 UIStackView을 만드는 오전.

버튼 스택을 만들면 팬 제스처를 첨부하여 화면 주위로 버튼을 이동할 수 있습니다. 다음 3 가지가 작동합니다.

  1. 가 나는 버튼을 누르면 내 메시지를 인쇄하는 재미를 호출 할 수 있습니다
  2. 만든 버튼 스택을 얻을.
  3. 버튼 스택을 이동할 수 있습니다.

I가 가지고있는 문제 ...

나는 버튼을 처음으로하고 버튼 스택의 문 gesture.type == .ended 라인이 트리거되는 경우, 잃을 제어 스택으로 이동하면.

즉, 버튼이 더 이상 작동하지 않으며 더 이상 움직일 수 없습니다.

아무도 도와 줄 수 있습니까? buttonStack에 감사

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = .lightGray 

     let ButtonStack = createButtonStack(label: “Button One”, btnTag: 1) 

     view.addSubview(ButtonStack) 

     ButtonStack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
     ButtonStack.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 

     let panGuesture = UIPanGestureRecognizer(target: self, action: #selector(pan(guesture:))) 

     ButtonStack.isUserInteractionEnabled = true 
     ButtonStack.addGestureRecognizer(panGuesture) 
    } 

    func createButtonStack(label: String, btnTag: Int) -> UIStackView { 

     let button = UIButton() 
     button.setImage(imageLiteral(resourceName: "star-in-circle"), for: .normal) 
     button.heightAnchor.constraint(equalToConstant: 100.0).isActive = true 
     button.widthAnchor.constraint(equalToConstant: 100.0).isActive = true 
     button.contentMode = .scaleAspectFit 
     button.tag = btnTag 

     switch btnTag { 
     case 1: 
      button.addTarget(self, action: #selector(printMessage), for: .touchUpInside) 
     case 2: 
      break 
     default: 
      break 
     } 

     //Text Label 
     let textLabel = UILabel() 
     textLabel.backgroundColor = UIColor.green 
     textLabel.widthAnchor.constraint(equalToConstant: 100.0).isActive = true 
     textLabel.heightAnchor.constraint(equalToConstant: 25.0).isActive = true 
     textLabel.font = textLabel.font.withSize(15) 
     textLabel.text = label 
     textLabel.textAlignment = .center 

     //Stack View 
     let buttonStack = UIStackView() 
     buttonStack.axis = UILayoutConstraintAxis.vertical 
     buttonStack.distribution = UIStackViewDistribution.equalSpacing 
     buttonStack.alignment = UIStackViewAlignment.center 
     buttonStack.spacing = 1.0 

     buttonStack.addArrangedSubview(button) 
     buttonStack.addArrangedSubview(textLabel) 
     buttonStack.translatesAutoresizingMaskIntoConstraints = false 

     return buttonStack 
    } 

    @objc func printMessage() { 
     print(“Button One was pressed”) 
    } 

    @objc func pan(guesture: UIPanGestureRecognizer) { 
     let translation = guesture.translation(in: self.view) 

     if let guestureView = guesture.view { 
      guestureView.center = CGPoint(x: guestureView.center.x + translation.x, y: guestureView.center.y + translation.y) 

      if guesture.state == .ended {     
       print("Guesture Center - Ended = \(guestureView.center)") 
      } 
     } 
     guesture.setTranslation(CGPoint.zero, in: self.view) 
    } 
+1

귀하가 게시 한 동일한 코드를 실행했습니다. 그리고 그것은 완벽하게 작동합니다. 스택보기를 다른 위치로 이동 한 후에도 아무런 문제없이 버튼을 탭할 수 있습니다. – PGDev

+0

@PGDev. 통찰력을 가져 주셔서 감사합니다. 그것은 내 버튼 하나가 행동해야한다는 사실에 대해 생각할 무언가를주었습니다. 내 실제 프로젝트에는 동일한 방식으로 동작해야하는 여러 개의 버튼이 있지만 이동 한 후에는 그렇지 않습니다. 내 코드의 다른 부분을 더 자세히 살펴보고 왜 하나의 버튼이 작동하는지 알아 보도록하겠습니다. 그러나 여러 개의 버튼은 아닙니다. 감사합니다 – K1llarney

답변

1

당신이 자동 레이아웃 사용하는 경우 당신은 guestureView.center centerX를 직접 조작 할 수 있습니다. 끌기 효과를 얻으려면 구속 조건을 가지고 작업해야합니다. 그래서 대신 ButtonStack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true의 당신의 라인을 따라 뭔가를해야합니다

let centerXConstraint = ButtonStack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor) 
centerXConstraint.isActive = true 
ButtonStack.centerXConstraint = centerXConstraint 

은 다음과 같이 그것을 위해 당신은 ButtonStack 클래스 유형 NSLayoutConstraint의 약한 속성을 선언해야한다. centerY 제약 조건에 대해 동일한 작업을 수행 할 수 있습니다.

그런 다음 func pan(guesture: UIPanGestureRecognizer) 메서드에서 centerXConstraintcenterYConstraint 속성을 ButtonStack보기에서 직접 조작 할 수 있습니다.

또한 ButtonStack에서 translatesAutoresizingMaskIntoConstraints 속성을 false로 설정하지 않는 것을 확인했습니다. autolayout을 프로그램 적으로 사용할 때마다 그렇게해야합니다.

+0

감사합니다 marosoaie, 약한 NSLayoutConstraint 속성을 사용하여 살펴 보겠습니다. buttonStack에서'translatesAutoresizingMaskIntoConstraints = false'에 관해서는,'createButtonStack' 함수 내에서 buttonStack을 반환하기 전에 이것을 라인에 설정했습니다. – K1llarney

0

PGDev 및 marosoaie에게 감사드립니다. 이 두 가지 모두 나를 이해할 수있는 통찰력을 제공했습니다.

내 코드는 버튼 하나로 작동했지만 프로젝트에는 UIStackView 내부에 3 개의 버튼이있었습니다.

한 단추를 옮기면 효과적으로 UIStackView가 손상되어 이동 한 단추를 제어 할 수 없게됩니다.

여기 수정 사항은 UIStackView에서 3 개의 버튼을 가져와 문제없이 3 개의 버튼을 모두 이동하고 제어 할 수있게되었습니다.

단추/텍스트 필드 UIStackView에 핸들을 유지하는 데는 .tag을 UIStackView에 추가하여이 작업을 수행했습니다.

일단 요소를 이동하면 팬의 .ended 동작이 .tag에 액세스 할 수 있으므로 이동 된 버튼 스택을 식별 할 수 있습니다.

모든 입력에 대해 다시 한 번 감사드립니다.