Подклассы UIButton
не рекомендуется начинать с :) Если вам нужен эффект визуальной обратной связи, вы можете иметь UIView
и добавить распознаватель tapGesture
.И при обнаружении касания вы можете сделать
Swift
let touchPoint = tapGestureRecognizer.location(in: your_view)
if your_inner_button.frame.contains(touchPoint) {
your_inner_button.sendActions(for: .touchUpInside)
}
Objective-C
CGPoint point = [self.tapGesture locationInView:self];
if (CGRectContainsPoint(self.frame, point)) {
[self sendActionsForControlEvents:UIControlEventTouchUpInside];
}
Выше одного делаетне имеет особого смысла, потому что, если вы уже обнаружили касание и выяснили, что касание находится в рамке вашего требования, зачем вам даже нажимать кнопку, вызывать performSelector
напрямую. Таким образом, вам не нужна кнопкарассмотрите скорее все, что вам нужно, это просто View
Просто чтобы уточнить, что можно делать то, что вы хотите,
Если по каким-то неизвестным причинам вы не можете это сделать, и вывынуждены (под дулом пистолета, я полагаю: P) использовать две кнопки друг над другом, вы всегда можете передать прикосновение к кнопке ниже, используя hitTest
Swift
class MyButton: UIButton {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if your_inner_button.frame.contains(point) {
return your_inner_button
}
return nil
}
}
Objective-C
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(your_inner_button.frame, point)) {
return your_inner_button
}
return nil;
}
Чтобы это работало, вам нужно будет передать ссылку на нижнюю кнопку на верхнюю кнопку, что не должно быть проблемой, потому что выв любом случае есть подкласс для верхней кнопки :) Это запах кода?Для меня да, но будет ли это служить вашим потребностям?Да, это так:)
Надеюсь, это поможет