【问题标题】:Unresponsive UIButton in subview added to UIStackView子视图中无响应的 UIButton 添加到 UIStackView
【发布时间】:2017-01-03 04:30:27
【问题描述】:

UISplitView 的detailViewController 中,我将子视图添加到UIScrollView 内的UIStackView

仅使用不带subviewsimages 的系统按钮会产生响应按钮,但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")

}

【问题讨论】:

    标签: swift uibutton scrollview uistackview


    【解决方案1】:

    我遇到了完全相同的问题:包含视图的 StackView。每个视图都包含一个按钮和一个标签。出于布局原因,视图只是容器。

    在我的例子中:我没有给视图一个高度约束,它似乎有一个零高度(在更改背景颜色以进行调试后,我没有看到视图),但是按钮和标签是可见的(但是无反应)。

    在我向布局视图添加高度约束后,(调试)背景颜色可见并且按钮按预期响应。

    【讨论】:

    • 这救了我,谢谢。我添加了一个缺失的label.bottomAnchor.constraint(...),然后一切又开始神奇地工作了。
    • 我遇到了类似的问题。我没有为包装视图设置宽度约束,所以它在运行时宽度为零。
    • 和我一样的问题,我缺少高度限制。谢谢
    【解决方案2】:

    就我而言,是 StackView 的 aligment 属性导致了问题。

    当我将该属性设置为 Fill 而不是 Center 时,问题就消失了。

    【讨论】:

    • 谢谢你!我已经尝试了我能想到的一切,我从来没有想过要尝试!
    • 谢谢你,它帮助我。
    • 正是 UIKit 所做的这种事情让我想通过我的 Mac 通过一个窗口。感谢您的回答!
    • 谢谢!我想做的只是将一堆水平按钮居中,它破坏了整个对话框。完全没有互动。
    【解决方案3】:

    似乎有什么东西覆盖在您的按钮上并捕获了所有的触摸事件。

    1.如果不需要,切勿开启 userInterectionEnabled

    没有理由像 subView 这样的普通视图应该将 userInteractionEnabled 设置为 true,所以将其设置为 false。

    2。找出错误:

    要找出女巫视图捕获事件,请在设备上启动您的应用并导航到 stackView。现在在 Xcode 中,按下“Debug View Hierarchy”按钮(位于控制台输出的正上方)

    之后,您将看到设备上当前显示的每个视图。 你现在要做的是找出按钮上方的视图,然后在代码中将它们的 userInteractionEnabled 值设置为 false。

    【讨论】:

    • M Kremer 非常感谢您的调试建议。这是正确的教科书和功能方法,因此我将其标记为正确,但我未能使用这种方法找到重叠。因为我知道堆叠按钮有效而堆叠子视图没有(对我而言),所以我的解决方案是堆叠按钮而不是其中带有按钮的子视图。我根据状态更改了每个按钮的背景。我没有设置标签,而是设置了标题。没有要重叠的视图,因为所有视图都应包含在按钮中。
    • 所有视图的默认值为YES。
    • 第一个建议没有任何意义,每次您将视图放在情节提要上时,总是设置用户交互。
    • 您的“调试视图层次结构”显示一切正常,按钮及其所有父视图启用了“用户交互”。按钮仍然不起作用。发现这仅仅是因为它在堆栈视图内,对齐“领先”。将对齐更改为“填充”,现在一切正常(即使层次结构没有变化)。
    【解决方案4】:

    我自己也遇到了这个问题。就我而言,我有一个 UIStackView 作为我的 UIButton 的子视图。我需要在堆栈视图上设置isUserInteractionEnabled = false 才能让我的按钮工作。这可能是在任何 UIButton 子视图上设置的明智之举。

    【讨论】:

    • 我遇到了完全相反的问题,我必须在我的 UIStackView 上设置 isUserInteractionEnabled = true 才能让按钮注册水龙头。这是我以编程方式创建的 UIStackView。
    • 哦哇..这应该更高。这也引起了我的问题,并通过= false 修复
    【解决方案5】:

    就我而言,我在loadView 中设置了一个自定义视图子类。该子类有isUserInteractionEnabled = false,它转换为所有子视图,包括我的stackView及其所有视图和按钮。

    【讨论】:

      【解决方案6】:

      按照theGuy的answer,我使用了sherlock app,我立即发现了问题:

      【讨论】:

      • 这比将用户交互设置为 false 更有意义。
      【解决方案7】:

      我注意到 XCode 12 中的一个错误(我猜)。 当我的 IBOutlet func(在 swift 上)为空时,我在空 func 的主体内或 func 声明本身上放置了一个断点,然后触摸按钮 - XCode 不会在我的断点处停止(在模拟器上测试)。

      【讨论】:

        【解决方案8】:

        就我而言,这只是 Xcode 的错误。我刚刚关闭并重新打开它。它刚刚奏效。我当前的 Xcode 版本是 11.4.1。

        【讨论】:

          【解决方案9】:

          对我来说,问题是我正在从情节提要中为 Stack View 实例化视图,而我的 ViewController 没有添加到视图结构中,但 UIView 做到了。这就是 UIViewController 子类中的按钮操作不起作用的原因。因此,Mostafa Aghajani 从这里https://stackoverflow.com/a/42179529/344386 的回答帮助了我。 如果我这样做:

              let testViewController = storyboard.instantiateViewController(withIdentifier: "TestViewController") as! TestViewController
              
              view.addSubview(testViewController.view) 
              // OR FOR STACK VIEW
              stackView.addArrangedSubview(testViewController.view)
          

          当我检查“XCode / Debug / View debugging / Capture view hierarchy”时,通常视图结构看起来像 UIViewController / UIView。 但在这种情况下不是。 关键是这样做:

              let testViewController = storyboard.instantiateViewController(withIdentifier: "TestViewController") as! TestViewController
              self.addChild(testViewController) // this is the key
          
              view.addSubview(testViewController.view) 
              // OR FOR STACK VIEW
              stackView.addArrangedSubview(testViewController.view)
          

          然后 UIViewController 被添加到视图层次结构中,并且我在 testViewController 内的 UIButton 开始工作。 这就是一种萨满教,可能是我做错了什么。

          【讨论】:

            【解决方案10】:

            我也遇到过同样的问题。原因是我设置了button.alpha = 0,同时设置了button.layer.opacity = 1.0。在这种情况下,按钮虽然可见,但不会响应操作。所以设置 button.alpha = 1.0 就是答案。愿这有帮助!

            【讨论】:

              【解决方案11】:

              我的 stackview 中发生了这种情况,因为按钮超出了 stackview 的范围 - 但这在故事板视图中并不明显。要确认这是问题所在,请选择堆栈视图并在属性检查器中打开“剪辑到边界”以查看您的按钮是否超出堆栈视图。您可能必须检查父层次结构中的每个堆栈视图,一直到最顶层的堆栈视图。还要检查所有手机尺寸 - 可能适用于 iPhone 11 的功能可能适用于 iPhone4s。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-10-04
                • 1970-01-01
                • 2013-11-11
                • 1970-01-01
                • 1970-01-01
                • 2016-07-27
                • 1970-01-01
                • 2012-07-20
                相关资源
                最近更新 更多