UISplitView
のdetailViewControllerで、UIStackView
内のUIScrollView
にサブビューを追加しました。
subviews
またはimages
なしでシステムボタンを使用するだけでは、応答性の高いボタンになりますが、subviews
は干渉しているようです。
タッチの有効化は具体的にコーディングされています。タッチイベントの受信を無効にする重複がないように、各ビューを包含ビュー内に保持しようとしましたが、これが適切に行われたかどうかはわかりません。各subview
には、label
と画像付きのカスタムボタンが含まれています。次に、サブビューがstackview
に追加され、stackview
がscrollview
に追加されます。
助けてくれてありがとう。
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")
}
ボタンの上に何かが横たわっていて、すべてのタッチイベントをキャッチしているようです。
1。必要がない場合は、userInterectionEnabledをオンにしないでください
SubViewのような通常のビューでuserInteractionEnabledをtrueに設定する必要がある理由はないので、falseに設定します。
2。バグを見つける:
ウィッチビューがイベントをキャッチすることを確認するには、デバイスでアプリを起動し、stackViewに移動します。 Xcodeで、「Debug View Hierarchy」ボタンを押します(コンソール出力の真上に配置されます)。
その後、デバイスに現在表示されているすべてのビューが表示されます。ここで行うことは、ビューがボタンの上にあることを確認し、コードでuserInteractionEnabled値をfalseに変更することです。
まったく同じ問題が発生しました。ビューを含むStackViewです。各ビューには、ボタンとラベルが含まれています。ビューは、レイアウト上の理由から単なるコンテナです。
私の場合:ビューに高さの制約を与えず、高さがゼロのようです(デバッグのために背景色を変更した後、ビューは表示されませんでした)が、ボタンとラベルは表示されました(ただし応答しません)。
レイアウトビューに高さの制約を追加した後、(デバッグ)背景色が表示され、ボタンが期待どおりに応答しました。
私の場合、問題を引き起こしていたのはStackViewのaligment
プロパティでした。
そのプロパティをFill
ではなくCenter
に設定すると、問題は発生しなくなりました。
theGuyの answer に続いて、 sherlock app を使用しましたが、すぐに問題が見つかりました。
私は自分でこの問題に遭遇しました。私の場合、UIButtonのサブビューとしてUIStackViewがありました。ボタンを機能させるには、スタックビューでisUserInteractionEnabled = false
を設定する必要がありました。これは、UIButtonサブビューに設定するのが賢明なことです。
私の場合、loadView
にカスタムビューサブクラスを設定しました。そのサブクラスにはisUserInteractionEnabled = false
は、stackViewとそのすべてのビューとボタンを含むすべてのサブビューに翻訳されました。
私は同じ問題に遭遇しました。その理由は、button.layer.opacity = 1.0を設定しながら、button.alpha = 0を設定したためです。この場合、ボタンは表示されていてもアクションに応答しません。したがって、button.alpha = 1.0を設定することが答えです。それが助けになりますように!