【问题标题】:Child UIViews unable to receive touch events子 UIViews 无法接收触摸事件
【发布时间】:2018-04-27 23:15:43
【问题描述】:

我有一个嵌入了UITableViewUIViewController。这个表格视图的高度是整个屏幕的 3/4。 UIViewController 的剩余 1/4 有一个舍入的 UIButton,它在父视图之上触发一个新的 UIView。 (UITableView)。

在实例化和调用背景设置为的UIView 时: self.backgroundColor = UIColor(black: 1, alpha: 0.5) 它通常会用黑色透明背景填充整个视图,然后会有一个额外的 UIView 具有以下约束:

Leading: 10
Trailing: 10
Top: 50
Bottom: 50

这反过来又给了我在tableView 之上的“卡片”效果。然后,此“卡片”视图有一个 UITextview 属性,当用户点击嵌入了 textview 的视图时,该属性应该显示键盘。

问题: 在选择UITextview,或者甚至触摸这个“卡片”视图时,背景表被选中并与之交互。 'Card' 文本字段既不会抬起键盘,也不会使自己完全交互,因为父表控制器似乎正在获取触摸事件。

在 iOS 11 中遇到的这个问题有什么解决方案吗?我从未在 iOS 10 中遇到过这个问题。我正在使用 iPhone X 来进一步说明我的问题。

这是实际问题的示例。

注意:如果我选择卡片本身的黑暗区域,表格视图将接收触摸事件,但卡片视图中的文本区域不会接收。此卡片视图显示键盘的原因是我使用 textview.becomeFirstResponder 方法在代码中手动调用它。

附加说明:我还在整体呈现子视图上启用了isUserInteractionEnabled = false。仍然不起作用,父视图只接收触摸。

卡片代码

class Card: UIView {

// instantiating the textview 
var textview = UITextview()
var cardView = UIView()


private override init(frame: CGRect) {
    super.init(frame: frame)

    self.backgroundColor = UIColor(black: 1, alpha: 0.5)    
    self.cardView.backgroundColor = UIColor.white
    self.cardView.layer.cornerRadius = 8

    // Just demo the textview
    self.textview.frame = CGRect(x: 10, y: 100, width: 300. height: 100)



    self.addSubview(cardView) // adding the cardView as a subview to the background colored view
    cardView.addSubview(textview)

}

required init?(coder aDecoder: NSCoder) {
    fatalError("Error")
}

private func ConstrainCardWith() {
    // Constraints 

}


}
 extension UIView {

func Width()-> CGFloat {
    return UIScreen.main.bounds.size.width
}
func Height()-> CGFloat{
    return UIScreen.main.bounds.size.height
}
}

【问题讨论】:

  • 请添加一些代码:)
  • 你好像在设置 layer.z 位置
  • isUserInteractionEnabled 在子视图上将导致只有父级接收触摸。坏主意..
  • @incmiko 我不知道这一点。在 iOS 11 之前,我按照上述方式进行操作,但从未遇到过类似的问题。我的其他应用程序之一有这个问题。它是为 iOS 10 Swift 3 编写的。现在它也有问题:(
  • pastebin.com/KEy5ueEt 在 iOS 11 上仍然为我工作..

标签: ios iphone uitableview uiview


【解决方案1】:

问题是你的容器视图(cardview)没有框架,所以你的子视图(textview)不能被触摸,因为它超出了界限,所以只需在你的卡片视图中添加一些框架就可以解决这个问题

【讨论】:

  • cardView 本身受自动布局的约束。这可能是问题吗?
  • @DwellingNYC 当您以编程方式添加视图时,您需要将其 translatesAutoresizingMaskIntoConstraints 设置为 false,否则,它将自动设置其自动布局。所以在这种情况下,你添加了一个 size 为 0 的 cardview,然后它会将约束设置为零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多