вертикально выравнивая UINavigationItems - PullRequest
7 голосов
/ 04 июля 2011

Я настроил высоту UINavigationBar на 100px, и я хотел бы добавить кнопки на эту настраиваемую панель.

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

enter image description here

Вот код;сначала я создаю контроллер навигации в делегате приложения и добавляю одну кнопку справа.

// set main navigation controller
temp *tempc = [[temp alloc] initWithNibName:@"temp" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:tempc];

UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];

[tempc.navigationItem setRightBarButtonItem:navItem];
[self.window addSubview:self.navigationController.view];
[self.window makeKeyAndVisible];

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

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f);
    [self.navigationController.navigationBar setFrame:frame];
    [self.navigationController.navigationBar setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin];
}

Я также пытался добавить настраиваемое представление к rightBarButtonItem, но не могу заставить добавленное настраиваемое представление полностью касаться верхней части.

enter image description here

И код дляэта неудачная попытка:

// set main navigation controller
temp *tempc = [[temp alloc] initWithNibName:@"temp" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:tempc];

UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36.0f, 80.0f)];
[customView setBackgroundColor:[UIColor blueColor]];

UIButton *customButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[customButton setFrame:CGRectMake(0, 22.0f, 36.0f, 36.0f)];
[customButton setTitle:@"+" forState:UIControlStateNormal];

[customView addSubview:customButton];
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithCustomView:customView];

Кто-нибудь знает, как вертикально выровнять элементы UIBarButton на панели UINavigationBar?

Ответы [ 4 ]

13 голосов
/ 04 декабря 2014

Это переместит заголовок страницы и все кнопки вверх на 20 пикселей:

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-20.0 forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackgroundVerticalPositionAdjustment:-20.0 forBarMetrics:UIBarMetricsDefault];
12 голосов
/ 02 июля 2013

Текущий принятый ответ от alhcr (Вариант 1) не работает, если у вас есть только rightBarButtonItem и не осталось. Также делается предположение об упорядочивании подпредставлений UINavigationBar, которое не гарантировано и вполне может измениться в будущей версии iOS. Вот лучший способ настройки рамок навигационных кнопок:

// UINavigationBar subclass

- (void)layoutSubviews {

    [super layoutSubviews];

    UINavigationItem *navigationItem = [self topItem];

    for (UIView *subview in [self subviews]) {

        if (subview == [[navigationItem rightBarButtonItem] customView]) {

            CGRect newRightButtonRect = CGRectMake(...new rect...);
            [subview setFrame:newRightButtonRect];
        }
        else if (subview == [[navigationItem backBarButtonItem] customView]) {

            CGRect newBackButtonRect = CGRectMake(...new rect...);
            [subview setFrame:newBackButtonRect];
        }
    }
}
7 голосов
/ 04 июля 2011

Опция 1:

  • создать подкласс UINavigationBar
  • внутри переопределения этого класса - (void)layoutSubviews, где вы будете переставлять UIBarButtonItems
  • в Интерфейсном Разработчике, устанавливая класс UINavigationBar в UINavigationBarподкласс

Пример:

внутри подкласса UINavigationBar:

- (void)layoutSubviews {
    int index = 0;
    for ( UIButton *button in [self subviews] ) {
        if(index == 1) {
            [button setFrame:CGRectMake(5,40,60,40)]; //leftBarButtonItem
        } else if(index == 2) {
            [button setFrame:CGRectMake(275,40,40,40)]; //rightBarButtonItem
        }
        ++index;
    }
}

контроллер представления:

- (void)viewDidLoad {
...
    UIBarButtonItem *navItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
    UIBarButtonItem *navItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:nil action:nil];
    [self.navigationItem setRightBarButtonItem:navItem1];   
    [self.navigationItem setLeftBarButtonItem:navItem2];

    CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f);
    [self.navigationController.navigationBar setFrame:frame];
...
}

Опция 2 (вставка UIBarButtonItem не выполняетне работает):

UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,320,100)];
[self.view addSubview:navigationBar];

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(0,25,50,50)];
[navigationBar addSubview:button];
0 голосов
/ 12 сентября 2017

Я нашел решение этой проблемы, выполнив настройку во вкладках «Границы изображения» пользовательской кнопки. У меня в приложении было требование увеличить высоту панели навигации, и после увеличения высоты проблема с правыми изображениями RightBarButtonItem и leftBarButtonItem была устранена.

Найдите код ниже: -

UIImage *image = [[UIImage imageNamed:@"searchbar.png"];
UIButton* searchbutton = [UIButton buttonWithType:UIButtonTypeCustom];
[searchbutton addTarget:self action:@selector(searchBar:) forControlEvents:UIControlEventTouchUpInside]; 
searchbutton.frame = CGRectMake(0,0,22, 22);
[searchbutton setImage:image forState:UIControlStateNormal];
[searchbutton setImageEdgeInsets:UIEdgeInsetsMake(-50, 0,50, 0)];
// Make BarButton Item
 UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton];
self.navigationItem.rightBarButtonItem = navItem;
...