2016-08-26 7 views
1

В подробном контроллере UISplitView у меня есть subviews, добавленные в UIStackView внутри UIScrollView. Просто используя системные кнопки без подзапросов или изображений, результаты реагируют на кнопки, но субвью кажется мешающим. Включение касания специально закодировано. Я попытался сохранить каждый вид внутри содержащего представления, чтобы не было совпадений с недействительным приемом событий касания, но не уверен, что это сделано правильно. Каждый подзаголовок содержит ярлык и пользовательскую кнопку с изображением. Подвью затем добавляется в стеке, а стек - в scrollview. Спасибо за любую помощь. Извините фрагмент кода так долго.Unresponsive UIButton в subview добавлен в UIStackView

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

Кажется, что что-то лежит над вашей кнопкой и захватывает все события касания.

1. Никогда не включайте userInterectionEnabled, если вам не нужно это

Там нет причин, почему нормальный вид как подвид должен установить userInteractionEnabled установлен верно, так положить его ложь.

2. Найдите ошибку:

Чтобы узнать мнение ведьм улавливает начать событие приложение на устройстве и перейдите к stackView. Сейчас в Xcode, нажмите кнопку «Debug View Hierarchy» (расположенный прямо над выходом консоли)

enter image description here

После того, что вы будете видеть каждый вид, который отображается на устройстве. Теперь вы узнаете, какие взгляды находятся над вашей кнопкой, а затем в коде они преобразуют значение userInteractionEnabled в значение false.

+0

М Кремер благодарит вас за это предложение отладки. Это правильный учебник и функциональный подход, поэтому я отметил его как правильный, но мне не удалось найти перекрытие, используя этот подход. Так как я знал, что сложенные кнопки работали, когда укладывались подзаголовки (для меня), мое решение заключалось в том, чтобы складывать кнопки вместо подзапросов с кнопками в них. Я изменил фон каждой кнопки в зависимости от состояния. Вместо ярлыка я установил заголовок. Нет совпадений, поскольку все должно содержаться в кнопке. – Jolly

2

У меня была одна и та же проблема: StackView, который содержит представления. Каждое представление содержит кнопку и метку. Представления представляют собой только контейнеры для макета.

В моем случае: я не дал виду ограничение по высоте, и кажется, что он имел нулевую высоту (после изменения цвета фона для отладки я его не видел), но кнопка и метка были видны (но отвечать на запросы).

После того, как я добавил ограничение по высоте, я работал.