Ответ 1
Обычно это происходит, когда вы помещаете кнопку в UIScrollView. UIScrollView имеет свойство "dalaysContentTouches", которое по умолчанию имеет значение YES. Если это ДА, то прикосновение к кнопке будет отложено (чтобы дать время проверить, является ли это жестом прокрутки), поэтому вы не увидите, что произошло событие. Тем не менее, если вы нажмете на него, он будет зарегистрирован как кнопка нажатием, даже не выделяясь.
Я не уверен, что ваша настройка в точности, но похоже на аналогичную проблему. Проверьте любые распознаватели жестов, связанные с вашим пользовательским интерфейсом, и проверьте значения "delayaysTouchesBegan" и "delayaysTouchesEnded".
** отредактирован после экспериментов **
Я только что попробовал это на iOS 7.0, и, похоже, это трюк.
-(void)viewDidAppear:(BOOL)animated {
NSArray *subviews = self.pageViewController.view.subviews;
NSArray *viewHierarchy = [@[self.pageViewController.view] arrayByAddingObjectsFromArray:subviews];
int i = 0;
for (UIView *viewToCheck in viewHierarchy) {
for (UIGestureRecognizer *gestureRecognizer in viewToCheck.gestureRecognizers) {
NSLog(@"%d gestureRecognizer: %@", i++, gestureRecognizer);
gestureRecognizer.delaysTouchesBegan = NO;
}
}
}
Я получаю этот вывод
0 gestureRecognizer: <UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x8e9b510; state = Possible; delaysTouchesBegan = YES; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=delayed:, target=<_UIQueuingScrollView 0x9b7f800>)>>
1 gestureRecognizer: <UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail = {
<UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>>
}>
2 gestureRecognizer: <UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail-for = {
<UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>>
}>
который показывает UIScrollViewDelayedTouchesBeganGestureRecognizer, который, по-видимому, является обычным распознавателем для PageController, предназначенного для этого именно для вашей кнопки...
Но! Установите для свойства delayesTouchesBegan значение NO, а при нажатии нажмите кнопку. Надеюсь, это сработает и для вас.