2013-09-25 4 views
3

У меня есть панель инструментов внизу моего представления. Существует UIBarButton под названием «Сканирование», который должен обнаруживать, когда кто-то держит палец вниз и когда он поднимается.UIButton in Modal View over UIToolBar Over UITabBar Touch не обнаружен

Поскольку UIBarButton наследуется от UIControl, я не смог обнаружить это. В качестве обходного пути я создал невидимый UIButton и разместил его поверх моей панели инструментов и просто обнаружил прикосновения от него, а не UIBarButton.

Это прекрасно работает, пока я не представляю представление как Модальный вид (который скрывает UITabBar), если я коснусь, где будет отображаться панель инструментов, я не могу ее обнаружить. Если я касаюсь над панелью инструментов, он отлично работает.

Вот скриншот. (Кнопка невидима была красного цвета и растягивается быть высокой для тестирования)

working state

На скриншоте ниже, если вы касаетесь, где панель ничего не происходит. но над ним, где он красный, он отлично работает.

enter image description here

Вот некоторые из моего кода.

- (IBAction) scanTouchUp:(id)sender { 
    [linea barcodeStopScan:nil]; 
} 

- (IBAction) scanTouchDown:(id)sender { 
    [linea barcodeStartScan:nil]; 
} 

Эти методы прилагаются к «Touch Down» и «Touch Up Inside/Outside» соответственно.

Любая помощь будет оценена по достоинству.

+0

Итак, часть в красном, где вы все еще хотите обнаружить штрихи в Modal View? И только красная часть? – Unheilig

+0

Да, под красным полем находится элемент uibarbutton, который говорит «Сканировать». Когда вы удерживаете красную часть, она активирует периферийное устройство сканера штрих-кода. – Hackmodford

ответ

1

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

Вы можете решить эти проблемы, убедившись, что нажата кнопка. Вы можете сделать это, переопределив метод hitTest:withEvent: в представлении, содержащем кнопку. Это может выглядеть примерно так:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *result = [redButton hitTest:[redButton convertPoint:point fromView:self] withEvent:event]; 
    if (result) 
    return result; 

    return [super hitTest:point withEvent:event]; 
} 

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

+0

Прикованный, это почти наверняка хит-тестирование.Представления, сделанные за пределами их границ, видимы, но не поддаются отображению. Установка 'clipsToBounds' на' YES' в ваших представлениях поможет отладить эту проблему. – cbowns

+0

Я получаю «No visible @interface для« UIViewController »объявляет селектор« hitTest: withEven: »для« return [super hitTest: point with Event: event]; – Hackmodford

+0

У меня есть подкласс UIView, чтобы сделать это правильно? – Hackmodford

0

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

- (id)initWithCustomView:(UIView *)customView

и добавить его на панель инструментов, как и любой другой элемент.

Этот пользовательский вид (переданный методу, упомянутом выше) был бы «сканирующей» кнопкой. Затем вы можете обрабатывать его так, как вы хотите, не прибегая к некоторым невидимым элементам управления.

+0

Я пробовал это, и он делает то же самое :( – Hackmodford

0

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