События касания в пределах ~8 пикселей панели навигации не вызваны

У меня есть приложение с тремя кнопками (на самом деле UIView и) выложены горизонтально под панелью навигации.

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

Мне известно, что эта область непосредственно под навигационной панелью является "зарезервированной" для кнопки "Назад" и других элементов UINavigation, имеющих сенсорную область, которая выходит за пределы навигационной панели (довольно значительно), однако в некоторых случаях это не так. нет даже элемента навигации поблизости, чтобы украсть событие, и мои взгляды все еще не отвечают.

Странно то, что мне звонят в hitTest метод в моем UIView, просто никогда не трогает Began/Ended/ и т.д.

В результате очень трудно нажимать кнопки, и если кто-то UINavigationItem предмет украдет событие, даже если в hitTest Я возвращаю правильный UIView в систему.

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

Есть идеи? Спасибо!

4 ответа

Решение

Вы должны создать подкласс UBavigationBar и в CustomNavigationBar сделать это:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    if ([self pointInside:point withEvent:event]) {
        self.userInteractionEnabled = YES;
    } else {
        self.userInteractionEnabled = NO;
    }

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

Информацию о том, как создать подкласс UINavigationBar, вы можете найти здесь.

Код, предоставленный @Andrei, вызовет несоответствие стека контроллеров в iOS 7 при быстром нажатии и извлечении контроллеров. Сама система изменит userInteractionEnabled свойство до и после анимации push/pop. Вот как я исправил эту проблему.

@interface DMNavigationBar ()

@property (nonatomic, assign) BOOL changingUserInteraction;
@property (nonatomic, assign) BOOL userInteractionChangedBySystem;

@end

@implementation DMNavigationBar

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (self.userInteractionChangedBySystem && self.userInteractionEnabled == NO)
    {
        return [super hitTest:point withEvent:event];
    }

    if ([self pointInside:point withEvent:event])
    {
        self.changingUserInteraction = YES;
        self.userInteractionEnabled = YES;
        self.changingUserInteraction = NO;
    }
    else
    {
        self.changingUserInteraction = YES;
        self.userInteractionEnabled = NO;
        self.changingUserInteraction = NO;
    }

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

- (void)setUserInteractionEnabled:(BOOL)userInteractionEnabled
{
    if (!self.changingUserInteraction)
    {
        self.userInteractionChangedBySystem = YES;
    }
    else
    {
        self.userInteractionChangedBySystem = NO;
    }

    [super setUserInteractionEnabled:userInteractionEnabled];
}

@end

Если бы та же самая проблема и вышеупомянутые ответы были хорошими, и они указывают на краткое решение.

Тот же ответ для быстрой версии:

  class APLVNavigationBar: UINavigationBar {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
    if pointInside(point, withEvent: event){
        userInteractionEnabled = true
    }else{
        userInteractionEnabled = false
    }
    return super.hitTest(point, withEvent: event)
  }
}

Я не думаю, что это проблема, но вы выдвинули кнопки подпредставлений вперед?

[self.view bringSubviewToFront:buttonView]
Другие вопросы по тегам