web-dev-qa-db-ja.com

サブビューの応答しないUIButtonがUIStackViewに追加されました

UISplitViewのdetailViewControllerで、UIStackView内のUIScrollViewにサブビューを追加しました。

subviewsまたはimagesなしでシステムボタンを使用するだけでは、応答性の高いボタンになりますが、subviewsは干渉しているようです。

タッチの有効化は具体的にコーディングされています。タッチイベントの受信を無効にする重複がないように、各ビューを包含ビュー内に保持しようとしましたが、これが適切に行われたかどうかはわかりません。各subviewには、labelと画像付きのカスタムボタンが含まれています。次に、サブビューがstackviewに追加され、stackviewscrollviewに追加されます。

助けてくれてありがとう。

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView = UIScrollView()
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(scrollView)

    // Constrain the scroll view within the detailView
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))


    stackView = UIStackView()

    stackView.frame = CGRectMake(0,0,view.frame.width, 1000)
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .Vertical
    scrollView.contentSize = CGSizeMake(400, 1000)
    scrollView.addSubview(stackView)

    // Constrain the stackView within the scrollView
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))


    let selectedGroup: Group = GroupArray[5]

    let descriptorsArray = selectedGroup.descriptorsArray

    for descriptor in descriptorsArray {
        // Create a subview for each descriptor

        let subView = UIView()
        subView.frame = CGRectMake(0 , 0, self.stackView.frame.width-10, 54)
        subView.backgroundColor = UIColor.yellowColor()

        subView.heightAnchor.constraintEqualToConstant(54.0).active = true
        // Create a label for Descriptor subview

        let label = UILabel(frame: CGRectMake(20, 0, 200, 50))
        label.text = descriptor.name
        label.font = UIFont.boldSystemFontOfSize(22.0)
        label.textAlignment = .Left
        label.textColor = UIColor.brownColor()
        label.backgroundColor = UIColor.greenColor()
        label.heightAnchor.constraintEqualToConstant(50.0).active = true
        subView.addSubview(label)

        // Create a button for Checkbox
        let btn = UIButton()
        btn.frame = CGRectMake(220, 0, 50, 50)
        btn.backgroundColor = UIColor.blueColor()
        btn.setImage(UIImage(named:"checked.png"), forState: UIControlState.Normal)

        btn.heightAnchor.constraintLessThanOrEqualToConstant(50.0)
        btn.widthAnchor.constraintLessThanOrEqualToConstant(50.0)

        btn.addTarget(self, action: "btnPressed:", forControlEvents: UIControlEvents.TouchUpInside)

        subView.addSubview(btn)
        btn.userInteractionEnabled = true
        subView.userInteractionEnabled = true
        stackView.userInteractionEnabled = true
        scrollView.userInteractionEnabled = true
        stackView.addArrangedSubview(subView)


    }
}

func btnPressed(sender: UIButton!) {

    print("btn Pressed")

}
13
Jolly

ボタンの上に何かが横たわっていて、すべてのタッチイベントをキャッチしているようです。

1。必要がない場合は、userInterectionEnabledをオンにしないでください

SubViewのような通常のビューでuserInteractionEnabledをtrueに設定する必要がある理由はないので、falseに設定します。

2。バグを見つける:

ウィッチビューがイベントをキャッチすることを確認するには、デバイスでアプリを起動し、stackViewに移動します。 Xcodeで、「Debug View Hierarchy」ボタンを押します(コンソール出力の真上に配置されます)。

enter image description here

その後、デバイスに現在表示されているすべてのビューが表示されます。ここで行うことは、ビューがボタンの上にあることを確認し、コードでuserInteractionEnabled値をfalseに変更することです。

6
M. Kremer

まったく同じ問題が発生しました。ビューを含むStackViewです。各ビューには、ボタンとラベルが含まれています。ビューは、レイアウト上の理由から単なるコンテナです。

私の場合:ビューに高さの制約を与えず、高さがゼロのようです(デバッグのために背景色を変更した後、ビューは表示されませんでした)が、ボタンとラベルは表示されました(ただし応答しません)。

レイアウトビューに高さの制約を追加した後、(デバッグ)背景色が表示され、ボタンが期待どおりに応答しました。

19
theguy

私の場合、問題を引き起こしていたのはStackViewのaligmentプロパティでした。

そのプロパティをFillではなくCenterに設定すると、問題は発生しなくなりました。

8
jmartinalonso

theGuyの answer に続いて、 sherlock app を使用しましたが、すぐに問題が見つかりました。

enter image description here

1
abbood

私は自分でこの問題に遭遇しました。私の場合、UIButtonのサブビューとしてUIStackViewがありました。ボタンを機能させるには、スタックビューでisUserInteractionEnabled = falseを設定する必要がありました。これは、UIButtonサブビューに設定するのが賢明なことです。

1
Kyle Cronin

私の場合、loadViewにカスタムビューサブクラスを設定しました。そのサブクラスにはisUserInteractionEnabled = falseは、stackViewとそのすべてのビューとボタンを含むすべてのサブビューに翻訳されました。

1
Justin Vallely

私は同じ問題に遭遇しました。その理由は、button.layer.opacity = 1.0を設定しながら、button.alpha = 0を設定したためです。この場合、ボタンは表示されていてもアクションに応答しません。したがって、button.alpha = 1.0を設定することが答えです。それが助けになりますように!

0
responser