iOS: размещение кнопок панели навигации на настраиваемой панели навигации

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

#import "UINavigationBar+CustomWithShadow.h"

@implementation UINavigationBar (CustomWithShadow)

- (void)drawRect:(CGRect)rect {

    // Change the tint color in order to change color of buttons
    UIColor *color = [UIColor colorWithHue:0.0 saturation:0.0 brightness:0.0 alpha:0.0];
    self.tintColor = color;

    // Add a custom background image to the navigation bar 
    UIImage *image = [UIImage imageNamed:@"NavBar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, 60)];
}

- (void)layoutSubviews {

    self.frame = CGRectMake(0, 20, self.frame.size.width, 60);
}
@end

Единственная проблема теперь заключается в том, что большая панель навигации означает, что кнопки панели навигации оказываются слишком далеко вниз, например:

введите описание изображения здесь

Кто-нибудь знает, как можно поправить положение кнопок?

Спасибо за помощь!

Обновление:

Я добавляю кнопки на панель навигации в методе инициализации контроллера представления следующим образом:

// Create "Add" button for the nav bar
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
    target:self 
    action:@selector(createNewEntry:)];
[[self navigationItem] setRightBarButtonItem:addButton];
[addButton release];

person Erik Frisk    schedule 29.05.2011    source источник
comment
Как добавить UIBarButtonItem на планку? И где? Я сделал небольшой тест, в котором я добавляю btns через NIB, и все вроде нормально.   -  person Valentin Radu    schedule 29.05.2011
comment
Я добавляю их в метод инициализации контроллера представления, например, используя [[self navigationItem] setRightBarButtonItem:addButton];. Как я могу добавить кнопки через NIB?   -  person Erik Frisk    schedule 29.05.2011


Ответы (3)


Вам нужно будет добавить leftBarButtonItem и rightBarButtonItem в качестве настраиваемых элементов и возиться с фреймами .... например:

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0,5,buttonImage.size.width,buttonImage.size.height)];
[button setBackgroundImage:buttonImage forState:UIControlStateNormal];
[button addTarget:delegate action:@selector(barButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:titleString forState:UIControlStateNormal];
[button setTitleColor:CUSTOM_BAR_BUTTON_TITLE_COLOR forState:UIControlStateNormal];
[[button titleLabel] setFont:[UIFont boldSystemFontOfSize:14]];
[[button titleLabel] setShadowColor:CUSTOM_BAR_BUTTON_SHADOW_COLOR];
[[button titleLabel] setShadowOffset:CGSizeMake(0,-1)];

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
[button release];

[[self navigationItem] setRightBarButtonItem:barButton];
[barButton release];
person adam    schedule 29.05.2011
comment
Есть способ попроще? У меня есть кнопки на последующих представлениях, и я бы по возможности не хотел добавлять каждую из них в качестве настраиваемого элемента. Не стесняйтесь предлагать альтернативы тому, как я добавил тень на панель навигации, если она у вас есть :) - person Erik Frisk; 29.05.2011
comment
@Erik Вам нужно будет использовать customView-bar-button-item, взяв фактическую кнопку в качестве подпредставления, чтобы исправить такие проблемы смещения. - person Till; 29.05.2011
comment
Более простой способ добиться этого на всех кнопках навигации - создать подкласс или категорию UINavigationBarButton. - person adam; 30.05.2011
comment
Звучит неплохо, адам! Вы знаете, какие методы мне нужно было бы переопределить и как, или вы знаете, где я могу найти эту информацию? - person Erik Frisk; 31.05.2011

Попробуйте вместо этого добавить кнопки на панель навигации в методе viewDidLoad контроллера представления.

person Valentin Radu    schedule 29.05.2011
comment
Боюсь, никаких изменений. Кнопки продолжают выравниваться по нижней части панели навигации (которая спускается до конца тени). - person Erik Frisk; 29.05.2011

Мое решение, не самое лучшее, но у меня оно работает нормально. Моя настраиваемая панель навигации имеет высоту 55 (высота по умолчанию - 44). Я вырезал из своей настраиваемой панели навигации только 44 высоты и вставил ее в панель навигации. Затем я вырезаю следующую часть своей настраиваемой панели навигации (тени и т. Д.) И вставляю ее в виде изображения под панелью навигации. И это все. Кнопки в нужных местах ...

person mysho    schedule 23.11.2011