UIButton не выделяет в ViewController в UIPageViewController в iOS7

У меня есть UIButton в контроллере представления, который встроен в UIPageViewController. Контроллер просмотра страницы находится в режиме прокрутки (так что никаких жестов). Когда я касаюсь кнопки, будет вызываться метод действия, но нет видимых изменений состояния (выделенное состояние) для кнопки. Это означает, что кнопка выглядит нетронутой. Наблюдается только в iOS7. Любая работа для этого?

Случай 1: в Normal ViewController поведение кнопки с и без Tap

Before tappingAfter tapping

Случай 2: В одном из элементов управления представлением PageViewController поведение кнопки с и без Tap

Before tappingenter image description here

Ответы

Ответ 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, а при нажатии нажмите кнопку. Надеюсь, это сработает и для вас.

Ответ 2

  • проверьте состояния UIButton, определенные в xib или storyboard (но поскольку вы сказали это только в iOS7, не должно быть проблемой)

  • проверьте, какое состояние ваша кнопка имеет после нажатия на ваш метод IBAction

  • попытайтесь установить свое рекомендуемое состояние кнопки в методе IBAction

    yourButton.higlighted = YES;
    
    //or yourButton.selected = YES; setting selected state 
    

Ответ 3

В той же проблеме я столкнулся с UITableViewController. Я не уверен, что он работает с UIPageViewController, но, надеюсь, это помогает.

self.PageView.delaysContentTouches = NO;

В ViewController:

for (id obj in self.View.subviews)
    {
        if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
        {
            UIScrollView *scroll = (UIScrollView *) obj;
            scroll.delaysContentTouches = NO;
            break;
        }
    }

Ответ 4

Попробуйте указать состояние кнопки, выделенное с помощью кода в вашем методе IBAction, связанного с кнопкой.

Button.higlighted = YES;

или вы можете использовать выбранное состояние, когда кнопка нажата в вашем методе действий

[button setSelected:YES];

Ответ 5

UIColor *textColorHighlighted=[UIColor blackColor] ;

[_button setTitleColor:textColorHighlighted forState:UIControlStateHighlighted];

Ответ 6

Я не знаю, встречаются ли люди по этому поводу, но я сделал так много часов, пытаясь найти решение, и я, наконец, сделал это, поэтому для людей, которые имеют одинаковую проблему и работают в Swift, это сработало для меня:

Swift 3.1:

override func viewDidLoad() {
    super.viewDidLoad()
    let views = view.subviews

    for view in views {

        if let scrollView = view as? UIScrollView {
            scrollView.delaysContentTouches = false
        }
    }
}