Вы можете добавить computed property
на ваш добавочный номер, который вы можете установить в контроллере, если вы хотите включить в хит область, как это:
fileprivate let minimumHitArea = CGSize(width: 100, height: 100)
extension UIButton {
var isIncreasedHitAreaEnabled: Bool {
get {
// default value is false, so you can easily handle from outside when to enable the increased hit area of your specific button
return false
}
set {
}
}
open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// if the button is hidden/disabled/transparent it can't be hit
if self.isHidden || !self.isUserInteractionEnabled || self.alpha < 0.01 { return nil }
// only if it's true the hit area can be increased
if isIncreasedHitAreaEnabled {
// increase the hit frame to be at least as big as `minimumHitArea`
let buttonSize = self.bounds.size
let widthToAdd = max(minimumHitArea.width - buttonSize.width, 0)
let heightToAdd = max(minimumHitArea.height - buttonSize.height, 0)
let largerFrame = self.bounds.insetBy(dx: -widthToAdd/2, dy: -heightToAdd/2)
// perform hit test on larger frame
return (largerFrame.contains(point)) ? self : nil
}
return self
}
}
, а затем в контроллере представления просто установите isIncreasedHitAreaEnabled
в true
если вы хотят, чтобы увеличить его для определенной кнопки (например, в вашем viewDidLoad
):
override func viewDidLoad() {
super.viewDidLoad()
specialButton.isIncreasedHitAreaEnabled = true
}
Обновление:
Прежде всего метод, который вы используете, не работает, как ожидалось. А также мой подход с computed property
не работал, как я думал. Поэтому, даже если метод не работает, как ожидалось, я просто хочу обновить свой подход с помощью computed property
. Чтобы установить свойство снаружи, вы можете использовать Associated Objects. Также посмотрите here. С помощью этого решения в настоящее время можно было бы обрабатывать Bool
свойство isIncreasedHitAreaEnabled
от контроллера:
fileprivate let minimumHitArea = CGSize(width: 100, height: 100)
private var xoAssociationKey: UInt8 = 0
extension UIButton {
var isIncreasedHitAreaEnabled: Bool {
get {
return (objc_getAssociatedObject(self, &xoAssociationKey) != nil)
}
set(newValue) {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// if the button is hidden/disabled/transparent it can't be hit
if self.isHidden || !self.isUserInteractionEnabled || self.alpha < 0.01 { return nil }
if isIncreasedHitAreaEnabled {
// increase the hit frame to be at least as big as `minimumHitArea`
let buttonSize = self.bounds.size
let widthToAdd = max(minimumHitArea.width - buttonSize.width, 0)
let heightToAdd = max(minimumHitArea.height - buttonSize.height, 0)
let largerFrame = self.bounds.insetBy(dx: -widthToAdd/2, dy: -heightToAdd/2)
// perform hit test on larger frame
return (largerFrame.contains(point)) ? self : nil
}
return self
}
}
Альтернативой ответу @ ronatory является (1) подкласс UIButton как, скажем, 'SpecialButton', а затем расширять его вместо UIButton. – dfd
Обратите внимание, что переопределение функций из расширения является плохой идеей и не допускается в «чистом» быстром, только в классах Objective-C NSObject. Чтобы процитировать Apple Swift iBook: «Расширения могут добавлять новые функции к типу, но они не могут переопределять существующие функции» Выдержка из: Apple Inc. «Язык Swift Programming (Swift 3.0.1)». IBooks. https://itun.es/us/jEUH0.l –
Обновлен мой ответ. Но, к сожалению, метод работает не так, как ожидалось. Я думаю, что вы должны попробовать ответить матом. Http://stackoverflow.com/a/42182054/5327882 – ronatory