UINavigationItem Назад Слишком большая область касания кнопки - PullRequest
5 голосов
/ 12 октября 2010

На следующем снимке экрана, если я нажимаю «v» в «Доступных киосках», запускается действие кнопки «назад» ... (а не второго «a»).

alt text

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

Любые идеи?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 11 августа 2011

Это не ошибка, он делает то же самое в приложениях Apple и даже на некоторых (много / все?) Кнопках.Это поведение сенсорных событий на кнопках: область касания больше границ кнопки.

1 голос
/ 05 апреля 2012

Мне нужно было сделать то же самое, и в итоге я перебил метод UINavigationBar touchesBegan: withEvent и проверил координату y касания перед вызовом исходного метода.
Это означает, что когда касание было слишком близко кКнопка, которую я использовал под Навигацией, я мог отменить.

Пример: кнопка «Назад» почти всегда фиксирует событие касания вместо кнопки «Первая» enter image description here

Вот моя категория:

@implementation UINavigationBar (UINavigationBarCategory)
- (void)sTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
float maxY = 0;
for (UITouch *touch in touches) {
    float touchY = [touch locationInView:self].y;
    if ( [touch locationInView:self].y > maxY) maxY = touchY;
}

NSLog(@"swizzlelichious bar touchY %f", maxY);

if (maxY < 35 )
    [self sTouchesEnded:touches withEvent:event];
else 
    [self touchesCancelled:touches withEvent:event];
}
- (void)sTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
float maxY = 0;
for (UITouch *touch in touches) {
    float touchY = [touch locationInView:self].y;
    if ( [touch locationInView:self].y > maxY) maxY = touchY;
}

NSLog(@"swizzlelichious bar touchY %f", maxY);

if (maxY < 35 )
    [self sTouchesBegan:touches withEvent:event];
else 
    [self touchesCancelled:touches withEvent:event];
}

Реализация Swizzle Майком Эшем из CocoaDev

void Swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
    class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
    method_exchangeImplementations(origMethod, newMethod);
}

И эта функция вызывает функцию Swizzle

Swizzle([UINavigationBar class], @selector(touchesEnded:withEvent:), @selector(sTouchesEnded:withEvent:));
Swizzle([UINavigationBar class], @selector(touchesBegan:withEvent:), @selector(sTouchesBegan:withEvent:));

Я не знаю, согласна ли Apple с этим, это может нарушать их правила пользовательского интерфейса, я постараюсь обновить публикацию, если после отправки приложения в магазин приложений.

...