如何快速覆盖 UIView.pointInside?

Posted

技术标签:

【中文标题】如何快速覆盖 UIView.pointInside?【英文标题】:how to override UIView.pointInside in swift? 【发布时间】:2016-01-17 01:22:50 【问题描述】:

我正在尝试将我的代码从 obj-c 移植到 swift,但遇到了很多麻烦。

其中一个问题是覆盖 UIView 类的 pointInside:

class MyView : UIView
func pointInside(point: CGPoint, withEvent event: UIEvent) -> Bool 
    if point.x < 0 
        return false
     else 
        return true

    

如果我不添加“覆盖”,我会得到这个错误:

/xxx.swift:37:10: Method 'pointInside(_:withEvent:)' with Objective-C selector 'pointInside:withEvent:' conflicts with method 'pointInside(_:withEvent:)' from superclass 'UIView' with the same Objective-C selector

如果我添加“覆盖”,我会得到这个错误:

/xxx.swift:37:19: Method does not override any method from its superclass

根据文档,应该有一个pointInside函数

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/pointInside:withEvent:

【问题讨论】:

【参考方案1】:

UIKit 中的函数声明为

func pointInside(_ point: CGPoint, withEvent event: UIEvent?) -> Bool

可选性(即UIEvent?)需要匹配。

这个错误信息似乎没什么用;你可能想file a bug。

【讨论】:

【参考方案2】:

您也可以使用条件检查覆盖:

class PassThroughView: UIView 

     override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool 
            for subview in subviews as [UIView] 
                if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) 
                    return true
                
            
            return false
        
    

原帖:Swift: hitTest for UIView underneath another UIView

【讨论】:

【参考方案3】:

Swift 2.2 语法

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool 
    return true

注意 UIEvent 必须是可选的才能匹配超类

【讨论】:

以上是关于如何快速覆盖 UIView.pointInside?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中快速实现/覆盖方法?

如何把硬盘填满,最快速的

快速防止图像视图中的图像覆盖

快速覆盖 UIView 中的默认图层类型

快速覆盖类的属性

UIPageViewController:如何添加非分页工具栏或其他“覆盖”元素?