假设我们有一个带有一个子视图的视图控制器.子视图占据屏幕中心,所有侧面都有100px的边距.然后,我们在该子视图中添加一些可以单击的小东西.我们只是使用子视图来利用新框架(子视图内的x=0,y=0实际上是父视图中的100,100).

然后,假设我们在子视图后面有一些东西,比如菜单.我希望用户能够 Select 子视图中的任何"小东西",但如果没有任何内容,我希望通过它进行touch (因为背景无论如何都很清楚)到它后面的按钮.

我怎么才能做到这一点呢?看起来像触碰Began通过了,但是按钮不起作用.

推荐答案

为容器创建自定义视图,并覆盖PointInside:消息,以便在点不在合格的子视图中时返回False,如下所示:

Swift :

class PassThroughView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        for subview in subviews {
            if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) {
                return true
            }
        }
        return false
    }
}

目标C:

@interface PassthroughView : UIView
@end

@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *view in self.subviews) {
        if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
            return YES;
    }
    return NO;
}
@end

将此视图用作容器将允许其任何子级接收接触,但视图本身对事件是透明的.

Ios相关问答推荐

在SwiftData中从@ Query创建可排序、有序和分组的数据

如何从ipad获取用户定义的设备名称,IOS版本应大于16在flutter

在Android和iOS上从后台恢复应用程序后,inappwebview上出现白屏?

CIKernel的Metal Shader裁剪问题

在 Swift 中,对象如何被准确地从内存中移除?

更改订单时如何保存商品的位置?

Swift Combine 防止初始值触发接收器并同时防止重复?

如何在应用程序中显示我的小部件的快照?

使用 Foundation 解压缩文件

从视图模型中更新 EnvironmentObject

TextField 重复输入 SwiftUI

本月使用 iOS 的天数?

Select UITableViewCell 时 UIView backgroundColor 消失

如何以编程方式调用视图控制器?

是否可以在没有 Mac 的情况下为 iOS 制作 PhoneGap 应用程序?

UIView 动画与 CALayers

iOS 10 / Xcode 8 设备上的 NSLog 似乎被截断了?为什么?

用 PC 调试 ipad safari

如何找到 UILabel 的实际行数?

在 NSUserDefaults 中存储值是否有任何限制?