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

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

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

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

Странно то, что я am получаю вызов метода hitTest в моем UIView, просто никогда не затрагиваю Began / Ended / и т.д.* В результате очень трудно нажимать кнопки, и если кто-то находится рядом с UINavigationItem, предмет украдет событие, хотя в hitTest я возвращаюили направьте UIView в систему.

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

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

Ответы [ 4 ]

9 голосов
/ 15 мая 2012

Вы должны создать подкласс UINavigationBar, а в 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, вы можете найти здесь .

4 голосов
/ 11 октября 2013

Код, предоставленный @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
1 голос
/ 08 сентября 2015

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

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

  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)
  }
}
0 голосов
/ 07 февраля 2012

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

[self.view bringSubviewToFront:buttonView]
...