gpt4 book ai didi

ios - UIView 部分在 superView 之外没有接收到触摸

转载 作者:行者123 更新时间:2023-11-28 21:06:33 26 4
gpt4 key购买 nike

问题:viewWithGesture 包含 viewUserSees,并且可以在蓝色 containerView 中拖动。然而,viewWithGesture 是 containerView 的 subview ,因此当 viewWithGesture 处于极端状态时(此处所示 - 一半在 containerView 中,一半在 containerView 外),只有一半的 viewWithGesture 响应触摸,因此很难拖动。

注意:我意识到我应该重做所有将其保留在容器中并将其移出 containerView 的数学运算,但我非常想知道如何以“更糟糕”的方式执行此操作。

我对此进行了大量研究,并尝试实现 hittest() 和 pointInside(),但到目前为止,我成功地让应用程序崩溃了。

有没有好的,比较干净的方式让用户从containerView外面抓取? (如果可能的话,swift3)

编辑:绿色框是透明的,一半在 containerView 中,另一半不在。

stupid problem

最佳答案

为了让 View 接收触摸, View 及其所有祖先必须从 pointInside:withEvent: 返回 true。

通常,如果点在 View 边界之外,pointInside:withEvent: 会返回 false。由于绿色区域中的触摸位于容器 View 的边界之外,因此容器 View 返回 false,因此触摸不会击中手势 View 。

要解决这个问题,您需要为容器 View 创建一个子类并覆盖它的 pointInside:withEvent:。在您的覆盖中,如果该点位于容器 View 的边界或手势 View 的边界内,则返回 true。也许你可以偷懒(尤其是当你的容器 View 没有很多 subview 时),如果点在任何 subview 的边界内就返回 true。

class ContainerView: UIView {

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if super.point(inside: point, with: event) { return true }
for subview in subviews {
let subviewPoint = subview.convert(point, from: self)
if subview.point(inside: subviewPoint, with: event) { return true }
}
return false
}

}

关于ios - UIView 部分在 superView 之外没有接收到触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45470860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com