子视图中无响应的 UIButton 添加到 UIStackView
Unresponsive UIButton in subview added to UIStackView
在 UISplitView
的 detailViewController 中,我将子视图添加到 UIScrollView
中的 UIStackView
。
仅使用没有 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
像子视图这样的普通视图没有理由将 userInteractionEnabled 设置为 true,所以将其设置为 false。
2。查找错误:
要找出 视图捕获事件,请在设备上启动您的应用程序并导航到 stackView。现在在 Xcode 中,按下按钮 "Debug View Hierarchy"(位于控制台输出的正上方)
之后您将看到当前显示在您设备上的每个视图。
您现在要做的是找出按钮上方的视图,然后在代码中将其 userInteractionEnabled 值设置为 false。
我遇到了完全相同的问题:包含视图的 StackView。每个视图都包含一个按钮和一个标签。出于布局原因,视图只是容器。
在我的例子中:我没有给视图一个高度限制,它似乎有一个零高度(在更改背景颜色进行调试后我没有看到视图),但是按钮和标签是可见的(但没有反应)。
在我向布局视图添加高度约束后,(调试)背景颜色可见并且按钮按预期响应。
我遇到过同样的问题。原因是我设置了button.alpha = 0,而设置了button.layer.opacity = 1.0。在这种情况下,按钮虽然可见,但不会响应操作。所以设置 button.alpha = 1.0 就是答案。希望能有所帮助!
在我的例子中,导致问题的是 StackView 的 aligment
属性。
当我将 属性 设置为 Fill
而不是 Center
时,问题就消失了。
跟着那个家伙的 , I used the sherlock app 我立刻发现了问题:
就我而言,我在 loadView
中设置了自定义视图子类。该子类有 isUserInteractionEnabled = false
向下转换为所有子视图,包括我的 stackView 及其所有视图和按钮。
我自己 运行 进入了这个问题。在我的例子中,我有一个 UIStackView 作为我的 UIButton 的子视图。我需要在堆栈视图上设置 isUserInteractionEnabled = false
才能让我的按钮工作。这可能是在任何 UIButton 子视图上设置的明智之举。
就我而言,这只是 Xcode 的错误。我刚刚关闭并重新打开它。它刚刚起作用。我当前的 Xcode 版本是 11.4.1.
对我来说,问题是我正在从情节提要中为 Stack View 实例化视图,而我的 ViewController 没有添加到视图结构中,但 UIView 做到了。这就是为什么 UIViewController 子类的按钮操作不起作用的原因。所以来自这里 的 Mostafa Aghajani 的回答帮助了我。
如果我这样做:
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 被添加到视图层次结构中,我的 UIButton inside testViewController 开始工作。
这就是一种萨满教,可能是我做错了什么。
我的堆栈视图中发生了这种情况,因为按钮超出了堆栈视图的范围 - 但这在故事板视图中并不明显。要确认这是问题,select stackview 并在属性检查器中打开“clips to bounds”以查看您的按钮是否超出了 stackview。您可能必须检查父层次结构中的每个堆栈视图,一直到最顶层堆栈视图。在所有 phone 尺码上也检查一下 - 可能适用于 iPhone 11 的可能会夹在 iPhone4s 上。
我注意到 XCode 12 中的错误(我猜)。
当我的 IBOutlet func(在 swift 上)为空时,我在空 func 的主体内或在 func 声明本身上放置了一个断点,然后触摸按钮 - XCode 不会停止我的断点(在模拟器上测试)。
嗯,很明显,您可能觉得没有必要检查它。我可能花了一个小时尝试所有其他答案,我想节省您的时间。
检查自定义单元格的代码 class,尤其是 awakeFromNib
方法,查看单元格的 userInteractionEnabled
是否在某处设置为 false
。将其设置为 true
。瞧! :]
确保使用 addArrangedSubview
添加视图。
我遇到这个问题是因为我用 addSubview
将按钮添加到 UIStackView
。
在 UISplitView
的 detailViewController 中,我将子视图添加到 UIScrollView
中的 UIStackView
。
仅使用没有 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
像子视图这样的普通视图没有理由将 userInteractionEnabled 设置为 true,所以将其设置为 false。
2。查找错误:
要找出 视图捕获事件,请在设备上启动您的应用程序并导航到 stackView。现在在 Xcode 中,按下按钮 "Debug View Hierarchy"(位于控制台输出的正上方)
之后您将看到当前显示在您设备上的每个视图。 您现在要做的是找出按钮上方的视图,然后在代码中将其 userInteractionEnabled 值设置为 false。
我遇到了完全相同的问题:包含视图的 StackView。每个视图都包含一个按钮和一个标签。出于布局原因,视图只是容器。
在我的例子中:我没有给视图一个高度限制,它似乎有一个零高度(在更改背景颜色进行调试后我没有看到视图),但是按钮和标签是可见的(但没有反应)。
在我向布局视图添加高度约束后,(调试)背景颜色可见并且按钮按预期响应。
我遇到过同样的问题。原因是我设置了button.alpha = 0,而设置了button.layer.opacity = 1.0。在这种情况下,按钮虽然可见,但不会响应操作。所以设置 button.alpha = 1.0 就是答案。希望能有所帮助!
在我的例子中,导致问题的是 StackView 的 aligment
属性。
当我将 属性 设置为 Fill
而不是 Center
时,问题就消失了。
跟着那个家伙的
就我而言,我在 loadView
中设置了自定义视图子类。该子类有 isUserInteractionEnabled = false
向下转换为所有子视图,包括我的 stackView 及其所有视图和按钮。
我自己 运行 进入了这个问题。在我的例子中,我有一个 UIStackView 作为我的 UIButton 的子视图。我需要在堆栈视图上设置 isUserInteractionEnabled = false
才能让我的按钮工作。这可能是在任何 UIButton 子视图上设置的明智之举。
就我而言,这只是 Xcode 的错误。我刚刚关闭并重新打开它。它刚刚起作用。我当前的 Xcode 版本是 11.4.1.
对我来说,问题是我正在从情节提要中为 Stack View 实例化视图,而我的 ViewController 没有添加到视图结构中,但 UIView 做到了。这就是为什么 UIViewController 子类的按钮操作不起作用的原因。所以来自这里 的 Mostafa Aghajani 的回答帮助了我。 如果我这样做:
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 被添加到视图层次结构中,我的 UIButton inside testViewController 开始工作。 这就是一种萨满教,可能是我做错了什么。
我的堆栈视图中发生了这种情况,因为按钮超出了堆栈视图的范围 - 但这在故事板视图中并不明显。要确认这是问题,select stackview 并在属性检查器中打开“clips to bounds”以查看您的按钮是否超出了 stackview。您可能必须检查父层次结构中的每个堆栈视图,一直到最顶层堆栈视图。在所有 phone 尺码上也检查一下 - 可能适用于 iPhone 11 的可能会夹在 iPhone4s 上。
我注意到 XCode 12 中的错误(我猜)。 当我的 IBOutlet func(在 swift 上)为空时,我在空 func 的主体内或在 func 声明本身上放置了一个断点,然后触摸按钮 - XCode 不会停止我的断点(在模拟器上测试)。
嗯,很明显,您可能觉得没有必要检查它。我可能花了一个小时尝试所有其他答案,我想节省您的时间。
检查自定义单元格的代码 class,尤其是 awakeFromNib
方法,查看单元格的 userInteractionEnabled
是否在某处设置为 false
。将其设置为 true
。瞧! :]
确保使用 addArrangedSubview
添加视图。
我遇到这个问题是因为我用 addSubview
将按钮添加到 UIStackView
。