如何快速覆盖 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?的主要内容,如果未能解决你的问题,请参考以下文章