Вам необходимо переопределить метод UIView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
в родительском представлении. Если попадание находится внутри кнопки, вы возвращаете кнопку, иначе вы возвращаете ноль. Это часть обсуждения этого метода:
Этот метод пересекает иерархию представлений, отправляя
pointInside: withEvent: сообщение для каждого подпредставления, чтобы определить, какой
подпредставление должно получить сенсорное событие. Если pointInside: withEvent:
возвращает YES, затем иерархия подпредставления пересматривается; в противном случае его
ветвь иерархии представления игнорируется. Вам редко нужно называть это
метод сам, но вы можете переопределить его, чтобы скрыть сенсорные события от
подвиды .
EDIT:
Скажем, у вас есть подкласс UIView, который содержит bn и ai, вы можете реализовать метод, подобный этому
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(bn.frame, point)) {
return bn;
}
return nil;
}
таким образом, ваша кнопка будет получать сенсорные события (если они находятся внутри своего кадра), независимо от того, находится ли что-то поверх нее или нет. Вам не нужно больше ничего делать.