Когда iPhone обнаруживает касание на экране, он находит сенсорный вид с помощью «проверки нажатия». По умолчанию тестирование попаданий предполагает, что каждое представление является прямоугольником.
Если вы хотите, чтобы тестирование попаданий рассматривало ваш вид как другую форму, вам нужно создать подкласс (в вашем случае UIButton
) и переопределить метод pointInside:withEvent:
, чтобы проверить форму, которую вы хотите использовать.
Например:
@implementation MyOvalButton
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:self.bounds];
return [path containsPoint:point];
}
Я не проверял этот код.
Swift версия:
class MyOvalButton: UIButton {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return UIBezierPath(ovalIn: bounds).contains(point)
}
Не забудьте установить пользовательский класс вашей кнопки на MyOvalButton
в вашей раскадровке или в XIB, если вы создаете кнопку.
Вот демонстрация, в которой я соединил события касания и касания кнопки, чтобы сделать серый фон при касании кнопки: