2016-08-26 37 views
1

UISplitViewの詳細コントローラでは、UIScrollView内のUIStackViewにサブビューが追加されています。サブビューやイメージなしでシステムボタンを使用するだけで、反応するボタンが生成されますが、サブビューは干渉しているようです。有効にするタッチは、特別にコード化されています。私は、それぞれのビューを含むビューの中に保持しようとしましたので、タッチイベントの受信を無効にするオーバーラップはありませんが、これが適切に行われているかどうかはわかりません。 各サブビューには、画像とラベルのカスタムボタンが含まれています。サブビューはスタックビューに追加され、スタックビューはスクロールビューに追加されます。助けてくれてありがとう。申し訳ありませんが、コードスニペットは長すぎます。UIStackViewにサブビューの無応答UIButtonが追加されました

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") 

} 

答えて

0

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

何のサブビューのような通常のビューをtrueに設定userInteractionEnabled設定しておく必要があります理由ので、それはfalseに置くはありませんが必要ない場合は

1. userInterectionEnabledをオンにしないでください。

2.バグ検索:魔女のビューを見つけるに

をイベントは、デバイス上のアプリを起動し、stackViewに移動キャッチ。今Xcodeで、ボタンを押して「デバッグビュー階層」(右コンソール出力の上に配置)

enter image description here

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

+0

M Kremerはこのデバッグの提案に感謝します。正しい教科書と機能的なアプローチであるため、私はそれを正しいものとしてマークしましたが、このアプローチを使用して重複を見つけることに失敗しました。サブビューが積み重なっていない間に積み重ねられたボタンが動作していることを知っていたので、私の解決策はサブビューの代わりにボタンをスタックすることでした。私は各ボタンの背景を州によって変えました。ラベルの代わりに、私はタイトルを設定します。オーバーラップするビューはボタンにすべて含める必要があります。 – Jolly

2

まったく同じ問題がありました。ビューを含むStackViewです。各ビューにはボタンとラベルが含まれています。ビューはレイアウト用のコンテナのみです。

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

高さの制約を追加した後、私は働いていました。

関連する問題