Пользовательская панель навигации
Я ползал Dribble и нашел прилагаемый дизайн. Мне было интересно, как сделать пользовательскую панель навигации, как это. Я имею в виду, как создать навигационную панель один раз и повторно использовать ее неявно для каждого контроллера вида.
Я думал о том, что у меня есть контроллер корневого представления и наследуется для других контроллеров представлений, но я не знаю, как это сделать.
Любая идея или ссылка будут применены!
Приветствия.
Кирилл
![Nav bar image]()
Ответы
Ответ 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
.