2017-10-23 4 views
0

私は、パンジェスチャーでそれを移動した後、私のUIStackViewの要素を取得/維持しようとしています。UIStackView&Gestures

たとえば、ハンドルを取得しようとしている要素は、ボタンタグやテキストラベルのテキストのようなものです。

コードを説明...

を、私はそれは、ボタンやテキスト・ラベルが含まれている機能func createButtonStack(label: String, btnTag: Int) -> UIStackView

を経由して、UIStackViewを作成しています。

ボタンスタックが作成されると、画面にボタンを移動できるようにパンジェスチャーが追加されます。以下の3つの点が働きます。

  1. 私はボタンを押すと、私のメッセージを印刷する楽しさを呼び出すことができます
  2. を作成したボタンスタックを取得します。
  3. ボタンスタックを移動できます。

私はボタンが初めてスタックと声明gesture.type == .endedラインがトリガされた場合、私はボタンスタックのコントロールを失う移動したら、私が持っている問題は...

です。

つまり、ボタンは機能しなくなりました。これ以上移動することはできません。

誰でもお手伝いできますか?おかげ

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。あなたの洞察に感謝します。それは私の1つのボタンが必要なときに行動しているという事実を考えることを私に与えてくれました。私の実際のプロジェクトには、同じ方法で動作するはずの複数のボタンがありますが、移動した後は操作しないでください。私はコードの残りの部分を詳しく見て、なぜボタンが1つしか動作しないのかを調べるつもりですが、複数のボタンではありません。おかげで – K1llarney

答えて

1

あなたはbuttonStackに自動レイアウト使用している場合は、直接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にアクセスできるため、どのボタンスタックが移動されたのかを識別することができます。

すべての入力についてもう一度おねがいします。

関連する問題