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

Пользовательская панель навигации

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

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

Любая идея или ссылка будут применены!

Приветствия.

Кирилл

Nav bar image

4b9b3361

Ответ 1

Благодаря iOS5 теперь вы можете настроить внешний вид UINavigationBar без необходимости подкласса или создания категории.

Следующий блок кода (поместите его в свой метод applicationDidFinishLoading:) изменит UINavigationBar для всего приложения на любое изображение, которое вы ему даете.

Обратите внимание, что это будет ТОЛЬКО работать в iOS5

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];

Однако вы также можете изменить внешний вид одного UINavigationBar в зависимости от того, какой контроллер просмотра вы используете, используя следующий код в viewDidLoad.

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];

В приведенном выше коде обсуждаются только новые способы настройки внешнего вида UINavigationBar благодаря iOS5. Однако он не обсуждает способ реализации кнопок.

Однако добавление кнопок - совсем другая игра. Для этого я бы рекомендовал подклассификацию UINavigationBar, а затем добавив в нее нужные кнопки. Вероятно, вы даже можете уйти с помощью стандартного UINavigationBar, но настраиваемого UIBarButtonItem, который запустит определенный вид.

Например:

UIView *rightButton = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)] autorelease];
[rightButton addSubview:[UIImage imageNamed:@"rightButtonImage.png"]];

UIBarButtonItem *rightButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:rightButton] autorelease];
[rightButtonItem setAction:@selector(rightButtonAction:)];

Я не тестировал этот код, поэтому он не является решением для копирования/вставки, но он дает вам представление о том, что нужно сделать для выполнения "настраиваемых" типов UIBarButtonItems.

Удачи!

Ответ 2

В более старых версиях iOS вам нужно подклассифицировать UINavigationBar i.e.:

@interface CustomNavigationBar : UINavigationBar
@end

@implementation CustomNavigationBar

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.opaque = YES;
        self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"CustomBackground"]];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Skip standard bar drawing
}

@end

Чтобы использовать настраиваемую панель навигации в контроллере просмотра, вы должны изменить стандартное имя класса на CustomNavigationBar в XIB.

Кроме того, вы можете настроить пользовательскую навигационную панель программно:

UIViewController *tempController = [[[UIViewController alloc] init] autorelease];
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:tempController] autorelease];

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:navigationController];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:archive] autorelease];
[unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];
UINavigationController *customNavigationController = [unarchiver decodeObjectForKey:@"root"];

UIViewController *contentController = [[[ContentViewController alloc] init] autorelease];
customNavigationController.viewControllers = [NSArray arrayWithObject:contentController];

Теперь customNavigationController имеет настраиваемую панель навигации.

Ответ 3

установить пользовательский фон для NavigationBar

UIImage *navBackground =[[UIImage imageNamed:@"navbarBackground"] 
                 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UINavigationBar appearance] setBackgroundImage:navBackground forBarMetrics:UIBarMetricsDefault];

то в вашем контроллере просмотра задаются пользовательские представления для левого, правого и правого меню.

self.navigationItem.titleView = customTitleView;
self.navigationItem.leftBarButtonItem = customBarButton;
self.navigationItem.rightBarButtonItem = customBarButton2;

Ответ 4

Вам нужно будет создать свой собственный подкласс UINavigationBar и использовать в тех местах, где вам нужен навигационный контроллер.

В этом пользовательском классе вы будете рисовать фон, кнопки, текст и т.д.


Update

Собственно, более подробно рассмотрев этот пример, он выглядит как UIToolBar. Вы можете назначить методы навигации кнопкам типа popViewController: и т.д. Для индикатора "Подтвердить информацию" и индикатора прогресса вы можете использовать метку и изображение. Для правой кнопки это просто графика.

Конечно, приведенный вами пример - это просто концепция, а не фактическое приложение. Но с некоторым творчеством, несколькими часами кодирования и еще несколькими графическими проектами, вы можете достичь этого же интерфейса.

Ответ 5

Используя Category, добавьте код в свой файл делегата (.m)

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect
{
    UIImage *navBg = [UIImage imageNamed:@"NavBar.png"];
    [navBg drawInRect:CGRectMake(0, 0, 320, 44)];
}
@end

Edit:

Использование Category не очень хорошо, я написал демо без использования Category, нажмите здесь.

Ответ 6

Вы можете использовать UINavigationController и скрыть UINavigationBar.

Затем создайте свой собственный подкласс UIViewController, в котором есть все элементы навигации, а затем вид сгибающего размера, где идет содержимое. Сделайте все свои классы подклассом этого элемента и рисуйте в представлении. Кнопка просто должна вызвать [self.navigationController popViewControllerAnimated:YES], а UILabel в представлении просто должен установить свой текст в self.title.