Размещение пользовательского представления на основе UIBarButtonItem в панели навигации без горизонтального отступа по умолчанию - PullRequest
31 голосов
/ 17 января 2011

Как убрать горизонтальные отступы слева и справа от пользовательских левых и правых элементов UINavigationBar? Кажется, что по умолчанию iOS устанавливает ~ 10 точек заполнения.

Я настраиваю левую и правую кнопки панели навигации (я разочаровался в попытке установить свой собственный backButtonItem, поэтому я просто использую leftBarButtonItem).

В любом случае (влево или вправо) нажатие этих пользовательских кнопок указывает на то, что Apple, похоже, сохраняет некоторые отступы слева от leftBarButtonItem и справа от rightBarButtonItem; независимо от того, насколько широко я делаю пользовательские свойства фона и изображения кнопки UIB, я помещаю ее в элемент кнопки левой / правой панели в качестве его пользовательского представления.

Поскольку у UIBarButtonItems нет «фрейма», к которому я могу получить доступ, я не могу расположить их в пределах их суперпредставления так же, как и обычные UIViews.

Есть предложения по удалению этого отступа по умолчанию? Смотрите прикрепленный снимок экрана, чтобы увидеть бит, который я пытаюсь уменьшить до нулевой ширины. На снимке экрана значок «плюс» смещен вправо, потому что я дал ему вставку; но выделенное фоновое изображение, также предположительно использующее эту вставку, обрезается с правой стороны).

См. Изображение по адресу: https://skitch.com/starbaseweb/rj2e5/ios-simulator

Для справки, вот как я создаю свой пользовательский UIBarButtonItem (в данном случае это правая кнопка):

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action {
  UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom];

    customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f);

    [customButtonView setBackgroundImage:
        [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] 
        forState:UIControlStateNormal];
    [customButtonView setBackgroundImage:
        [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] 
        forState:UIControlStateHighlighted];

    [customButtonView setImage:
        [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] 
        forState:UIControlStateNormal];
    [customButtonView setImage:
        [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] 
        forState:UIControlStateHighlighted];

    [customButtonView addTarget:target action:action 
        forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] 
        initWithCustomView:customButtonView] autorelease];
    [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)];

    //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f);

    return customButtonItem;    
}

Ответы [ 2 ]

83 голосов
/ 09 ноября 2011

55Как прокомментировал выше, решение, которое я выбрал, основано на этом ответе на другой, но очень связанный вопрос: Как настроить UIToolBar для левого и правого отступа . Этому также способствует (и зависит от) iOS5, которая позволяет устанавливать несколько кнопок слева или справа вместо одной.

Вот пример удаления отступа слева от пользовательского элемента левой кнопки:

UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge:
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil];
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add

// Add the two buttons together on the left:
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil];

И с этим, левый отступ для элемента левой кнопки на панели навигации исчез!

ПРИМЕЧАНИЕ : это сработало для меня в iOS5 и iOS6. Учитывая, что iOS7 значительно отличается (от общедоступных демонстраций), тем из вас, кто с ранними семенами iOS7 должен проверить, действительно ли что-то такое непреднамеренное, как этот хак, продолжит работать для вас после iOS6.

3 голосов
/ 03 марта 2011

Я пробовал это, и это работает:

1) Создайте пользовательский подкласс UIToolbar, который ничего не делает в -drawRect:, не является непрозрачным и имеет backgroundColor = [UIColor clearColor].

2) Создайте пользовательский элемент UIBarButtonItem с панелью инструментов в качестве настраиваемого представления.

3) Добавьте свои кнопки на пользовательскую панель инструментов.

4) В вашей пользовательской панели инструментов переопределите -layoutSubviews и создайте собственный интервал.

...