Пропускайте кнопки и просто реагируйте на прикосновения в вашем представлении, которые содержат круг.
Создайте CGPath для каждой области, которую вы хотите захватывать касаниями. Когда ваш UIview получает касание, проверьте наличие членства в путях.
[Отредактированный ответ, чтобы показать детали реализации скелета - TomH]
Вот как я мог бы подойти к этой проблеме: (Я не проверял этот код, и синтаксис может быть не совсем правильным, но это общая идея)
1) Используя PS или ваше любимое приложение для создания изображений, создайте один png четверти кругов. Добавьте его в свой проект XCode.
2) Добавить UIView в интерфейс. Установите содержимое слоя UIView в png.
self.myView = [[UIView alloc] initWithRect:CGRectMake(10.0, 10.0, 100.0, 100,0)];
[myView.layer setContents:(id)[UIImage loadImageNamed:@"my.png"]];
3) Создайте CGPath, которые описывают интересующий вас регион в UIView.
self.quadrantOnePath = CGPathCreateMutable();
CGPathMoveToPoint(self.quadrantOnePath, NULL, 50.0, 50.0);
CGPathAddLineToPoint(self.quadrantOnePath, NULL, 100.0, 50.0);
CGPathAddArc(self.quadrantOnePath, NULL, 50.0, 50.0, 50.0, 0.0, M_PI2, 1);
CGPathCloseSubpath(self.quadrantOnePath);
// create paths for the other 3 circle quadrants too!
4) Добавить UIGestureRecognizer и слушать / наблюдать за касаниями в представлении
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[tapRecognizer setNumberOfTapsRequired:2]; // default is 1
5) Когда tapRecognizer вызывает свой селектор цели
- (void)handleGesture:(UIGestureRecognizer *) recognizer {
CGPoint touchPoint = [recognizer locationOfTouch:0 inView:self.myView];
bool processTouch = CGPathContainsPoint(self.quadrantOnePath, NULL, touchPoint, true);
if(processTouch) {
// call your method to process the touch
}
}
Не забудьте освободить все при необходимости - используйте CGPathRelease для освобождения путей.
Еще одна мысль: если изображение, которое вы используете для представления своих круговых квадрантов, является просто закрашенным цветом (то есть без причудливой графики, эффектов слоя и т. Д.), Вы также можете использовать пути, созданные в методе drawRect из UIView, чтобы рисовать квадранты тоже. Это устранит один из недостатков подхода, приведенного выше: нет тесной интеграции между графикой и путями, используемыми для проверки касаний. То есть, если вы поменяете графику на что-то другое, измените размер графики и т. Д., Ваши пути, используемые для проверки касаний, будут не синхронизированы. Потенциально кусок кода с высоким уровнем обслуживания.