Подтвердить что ты не робот

UINavigationBar UIBarButtonItems намного большая область щелчка, чем требуется

Надеюсь, кто-то может мне помочь, не пропустил сетку ответа и не смог найти ее -

UIBarButtonItems, добавленные в UINavigationBar, имеют гораздо большую площадь щелчка, чем требуется, например, открыть любой проект, у вас есть панель навигации с кнопками, нажимать где-нибудь между концом кнопки и названием навигационной панели - кнопка нажимает, когда вы явно не нажимаете на кнопку -

также попробуйте этот щелчок под навигационной панелью, под кнопкой, кнопка нажимает примерно на 5+ пикселей ниже навигационной панели -

моя проблема в этом -

Я добавил пользовательский заголовок с кнопками в tableview, но когда я нажимаю кнопки в заголовке, кнопки UINavigationBar запускают для этих 5+ пикселей вместо кнопок в заголовке tableview -

Я сделал тест и удалил кнопки из UINavigationBar, и интересно то, что для 5 пикселей ниже навигационной панели кнопки в заголовке не будут запускаться, даже если в навигационной панели нет кнопок -

его почти как навигационная панель зарезервировала около 5+ пикселей под собой как пространство кликов -

мой вопрос таков:

может кто-нибудь сказать мне, как заставить навигационную панель не захватывать эти дополнительные 5+ пикселей для своих кнопок?

Большое спасибо;)

4b9b3361

Ответ 1

Это единственное решение, которое я нашел. Создайте контейнер пользовательской кнопки:

//Create a container for the button
UIView *buttonContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 55, 44)];

//Create a smaller button
UIButton *closeButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 55, 25)];
[closeButton setTitle:@"Cancel" forState:UIControlStateNormal];
//center the title
closeButton.titleEdgeInsets = UIEdgeInsetsMake(23, 0, 0, 0);

[buttonContainer addSubview:closeButton];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:buttonContainer];

Ответ 2

Я не уверен на 100%, но, может быть, вы можете получить местоположение касания через класс UITouch?

UIBarButtonItem не расширяет UIResponder, но UINavigationBar делает!

Итак, если вы подклассифицируете UINavigationBar и используете этот подкласс в своем приложении, возможно, вы можете поймать координаты касания и проверить, соответствуют ли они вам, а затем принять решение применить действие панели навигации или действие кнопки (некоторыми пользовательское перенаправление).

Ответ 3

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

Ответ 4

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

Ответ 5

Попытка работать с дополнением UINavigation Bar может привести к неприятностям при отправке в магазин приложений. Было бы проще добавить дополнение к вашему настраиваемому заголовку. Как "толстый тюмень", я научился ценить HIG.

Ответ 6

Довольно старый вопрос, но, возможно, решение полезно и для других...

Я создал подкласс UINavigationBar, который переопределяет только один метод: " hitTest: withEvent:". Когда вызывается hitTest: withEvent, он проверяет, произошло ли событие внутри рамки панели навигации (pointInside: withEvent:) или нет. В случае, если событие произошло за пределами, флаг userInteractionEnabled установлен на НЕТ, поэтому событие будет проигнорировано навигационной панелью и ее просмотрами.

В моем случае подкласс навигационной панели вставлен через IB, но, конечно, также можно вставить его через 'UINavigationController initWithNavigationBarClass: toolbarClass:'

Заголовок:

@interface MMMasterNavigationBar : UINavigationBar

@end

Реализация:

@implementation MMMasterNavigationBar

/*
 hitTest:withEvent:

 The hit area in for navigation bar button items is enlarged by default.
 Other objects directly below the navigation bar doesn't receive tap events.
 We avoid the default enlarging of the tappable area by disabling userInteraction
 when the real tap is outside the navigation bar.

 */
-(UIView *)hitTest:(CGPoint)pPoint
         withEvent:(UIEvent *)pEvent {
    //FLog;

    if ([self pointInside:pPoint
                withEvent:pEvent]) {
        //NSLog(@"User interaction enabled");
        self.userInteractionEnabled = YES;

    } else {
        //NSLog(@"User interaction disabled");
        self.userInteractionEnabled = NO;
    }

    return [super hitTest:pPoint
                withEvent:pEvent];
}

@end

Ответ 7

Это можно сделать непосредственно из раскадровки. Перетащите UIView в каждый элемент навигации, установите для фона значение clearColor и размер. Перетащите кнопку в каждый UIView и сравните их.

Ответ 8

    var buttonContainer:UIView = UIView()
    buttonContainer.frame = CGRectMake(0, 0, 32, 32)

    var imagess:UIImage = UIImage(named: "[email protected]")!

    var closeButton:UIButton = UIButton()
    closeButton.setImage(imagess, forState: UIControlState.Normal)
    closeButton.frame = CGRectMake(10, 5, 20, 20)
    closeButton.contentMode = UIViewContentMode.Center
    closeButton.titleEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 0)

    buttonContainer.addSubview(closeButton)

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: buttonContainer)