2013-09-30 6 views
8

У меня есть несколько UIButtons в нижней части основного окна моего приложения. Эти кнопки с перерывами не выделяют, когда пользователь забирает их, но их целевые методы всегда вызываются. Я обнаружил, что распознаватель жестов Control Center мешает освещению UIButton. Если я перемещаю сложенный вид вверх в середину экрана, все работает так, как было разработано.UIButton внизу экрана только с кратковременным освещением

Вопрос сообщается здесь https://devforums.apple.com/message/865922

В качестве обходного пути я попытался установить подсвеченное состояние вручную с целевым методом. Это, похоже, имеет тот же эффект, что и UIButton.

Любые идеи, как обойти это без изменения этих элементов управления, чтобы появиться в другом месте приложения?

Возможно, я использую стандартный вид и добавляю все методы для взаимодействия касания вручную? Как мне это сделать? Стоит ли даже изучать?

+0

Кнопки иногда не выделяют, когда пользователь нажимает на них? И что вы понимаете под распознавателем жестов «Центра управления». Вы имеете в виду кнопки-встроенные распознаватели жестов? – bilobatum

+0

Я отредактировал свой вопрос. Когда пользователь нажимает кнопку в нижней части экрана, он только периодически выделяется. Это связано с жестом салфетки, предназначенным для создания Центра управления, блокирующего выделение. –

+0

Вы пробовали настройку UIControlStateSelected с кнопкой.selected = YES? –

ответ

4

Я нашел довольно простой обходной путь для этого. Использование стандартных свойств, таких как .highlighted = YES и .selected = YES, похоже, не работает в этом нижнем диапазоне. Вместо того, чтобы устанавливать выделенное состояние, я просто устанавливаю фоновое изображение кнопки в состояние подсвечивания с незаметной задержкой ПЕРЕД вызовом окончательного метода.

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 
[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; 
[self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; 

-(void)stopRecordingDelay 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; 

    [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; 
} 

- (void)stopRecording 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 

    //Do real stuff 
} 
3

Я недавно столкнулся с той же проблемой и искал всюду для ответа. Это то, что сработало для меня. Это была комбинация из двух вещей: жук жесткого диска UINavigationController и жест управления центра управления iOS 7 (вверх по экрану снизу экрана).

Отключить заднюю салфетки жест, если на UINavigationController:

в viewDidLoad:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
    self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
} 

Установите центр управления жест, чтобы показывать только стрелка вверх вместо того, чтобы показывать центр управления первым. Вы можете сделать это, переопределив следующий метод UIViewController:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

Надеюсь, это поможет!

+1

Это технически решение, да, но это требует изменения основного пользовательского опыта, спрятав строку состояния и отключив задний жест. Мое приложение не будет подходящим местом, чтобы скрыть строку состояния или отключить задний жест. –

1

Я опубликовал исправление для этой проблемы, которое возвращает подсветку, описанную в этом question. Выделение фиксируется путем подкласса UIButton и переопределения pointInside: для фиксации событий касания

+0

Вышеупомянутое решение «настройка выделенного состояния изображения» кажется хорошим. Но решение, представленное в потоке, упомянутом в этом комментарии, кажется идеальным. – satish

0

Если у вас есть кнопка, которая закрывает всю нижнюю часть экрана, вы можете столкнуться с проблемой, когда только левая часть имеет эту задержку.

Для того, чтобы нормализовать время обратной связи для всего одной кнопки может использовать следующее решение
(улучшенная версия Aaron Shekey в):

NSDate *touchDownTime; 

- (void)touchDown 
{ 
    self.alpha = 0.7; 
    touchDownTime = [NSDate date]; 
} 

- (void)touchUpInside 
{ 
    // basically at least 80ms feedback is guaranteed this way 
    // note: timeIntervalSinceNow returns negative 
    NSTimeInterval feedbackTimeLeftToShow = 
     MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); 
    [self performSelector:@selector(touchUpInsideAfterFeedback) 
      withObject:nil 
      afterDelay:feedbackTimeLeftToShow]; 
} 

- (void)touchUpInsideAfterFeedback 
{ 
    self.alpha = 1; 
} 

Примечание: performSelector может делать хорошо с отрицательными значениями задержек, но лучше быть в безопасности, чем извините

Смежные вопросы