как приложение для iphone facebook исправило панель навигации - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в разработке для iPhone и хочу спросить о контроллере навигации. Как сделать так, чтобы навигационный контроллер фиксировался по всему приложению, как панель навигации facebook. Он всегда показывает уведомления, друзей и сообщения в панели навигации.

Я пытаюсь добавить пользовательский вид в titleView, но он исчезает каждый раз, когда навигация нажимает новый вид?

Ответы [ 3 ]

6 голосов
/ 07 июня 2013

Был опубликован аналогичный вопрос (https://stackoverflow.com/questions/16773312/facebook-like-navigationbar), к сожалению, он был закрыт довольно быстро. Я выкупаю его намеченную славу здесь.

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

Использование раскадровок:

Simple setup in Storyboard

  1. Создание нового UINavigationController (Nav1).
  2. Установите UITabController в качестве корневого контроллера представления Nav 1. (Панель вкладок) Обратите внимание, что у него будет собственная навигационная панель (я пометил ее как «Persistent Nav Bar»).
  3. Создайте еще один UINavigationController (Nav 2).
  4. Установите выбранный контроллер представления (My View Controller) в качестве корневого контроллера представления Nav 2.
  5. Установите Nav 2 какпервый контроллер представления (вкладки) контроллера панели вкладок.

  6. Для Nav 1: в Инспекторе атрибутов -> Контроллер навигации -> Видимость панели, убедитесь, что поле имеет значение помечено (чтобы оно показывалоs Панель навигации).

  7. Для Nav 2: в Инспекторе атрибутов -> Контроллер навигации -> Видимость панели, убедитесь, что для поля не отмечен (чтобы он выигралне показывать панель навигации).

Если вы запустите приложение, вы должны увидеть видимый заголовок панели вкладок и скрытый заголовок вашего контроллера представления.Это дает вам основы постоянной навигационной панели.Вы можете сохранить PUSHing представления в стеке из My View Controller, и он останется постоянным.Представление MODAL открывает новый контекст, поэтому постоянство теряется.Если вы повторите эти шаги, вы сможете создать тот же эффект и для модально представленных представлений.

Остальная часть этого ответа касается скрытия панели вкладок и управления элементами панели навигации.

Так что это здорово, но как разместить свой пользовательский вид в панели навигации и как скрыть эту панель вкладок?

Создать подкласс изUITabBarController и назначьте его контроллеру панели вкладок в нашей раскадровке.

Скрытие панели вкладок

Вы можете скрыть панель вкладок любым способом.Если вам интересно, подробнее об этом ( Как скрыть uitabbarcontroller );этот небольшой фрагмент адаптирован из моего ответа в этой теме:

CGRect screenRect = [[UIScreen mainScreen] bounds];
float fHeight = screenRect.size.height;
if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
{
    fHeight = screenRect.size.width;
}

for(UIView *view in self.view.subviews){
    if([view isKindOfClass:[UITabBar class]]){
        [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
    }else{
        [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
    }
}

Это сместит панель вкладок вне поля зрения и изменит размер представления, чтобы заполнить пространство (без анимации, как если бы ее там никогда не было),Добавьте этот фрагмент в начало viewDidLoad, чтобы убрать эту полосу.

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

В методе viewDidLoad нашегоПодкласс TB, вы можете создать свой собственный вид с помощью кнопок и добавить его на панель навигации следующим образом: [self.navigationItem setTitleView:myCustomTitleView]; Easy.

Если он не отображается должным образом, убедитесь, что вы определили его кадр, прежде чем установить его в качестве titleView.Затем, добавив его, используйте [myCustomTitleView sizeToFit], чтобы он был прилегающим к панели навигации.

Настройка элементов панели кнопок

Настройка элементов панели слева и справатребуется небольшое изменение в обозначениях.Обычно вы устанавливаете левую кнопку на панели, ссылаясь на self.navigationItem.leftBarButtonItem.Эта ссылка фактически указывает на левую кнопку панели скрытой панели навигации.Чтобы получить доступ к навигационной панели VISIBLE, используйте self.tabBarController.navigationItem.leftBarButtonItem.Легко!

Обработка элемента кнопки возврата утерянной панели

Одна вещь, которой вы жертвуете с помощью постоянной навигационной панели, - это управление перемещенными представлениями.Такие вещи, как стрелка назад, не будут отображаться (они отображаются на скрытой панели навигации).Вы можете преодолеть это, установив свой подкласс TabBarController в качестве делегата для своих контроллеров представления (которые все должны быть UINavigationControllers).

for (UINavigationController *navController in self.viewControllers) {
    navController.delegate = self;
}

Всякий раз, когда любой из этих UINavigationControllers выдвигает другое представление, вы можете перехватить это действие с этим делегатомМетод:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

Здесь вы можете проверить, сколько контроллеров представления выдвигается:

if(navigationController.viewControllers.count > 1){
    //create a custom back button here and add it to the nav bar
}else{
    //set the left bar button (where the custom back button would sit) to nil
}

Пользовательская кнопка возврата может вызывать метод в вашем подклассе контроллера панели вкладок, который сообщает текущему выбранному контроллеру представления, чтобы выскочить его текущее представление.

Это то, как Facebook это сделал?

Я не могу подтвердить, что так Facebook это сделал (вероятно, нет), но он достигнет аналогичногоэффект.Я эффективно использовал его в своем последнем приложении (http://www.waterboyapp.com),, которое было с радостью принято Apple без промедления. Я хотел бы, чтобы кто-то опубликовал это раньше, поэтому мой вклад здесь поможет сэкономить часы / дни поиска.

В сторону

Дополнительный бонус к этой реализации (кроме простоты и элегантности) заключается в том, что вы можете связать несколько контроллеров представления с панелью вкладок.немного творчества, вы можете воссоздать пользовательские кнопки на панели навигации (на основе вкладок), которые выполняют ту же функцию, что и панель вкладок.Это экономит место на экране (поскольку панели вкладок довольно большие) и по-прежнему использует панель вкладок для выполненияваш обмен местами.

0 голосов
/ 18 марта 2012

вот что у меня сработало:

toolBar = [[UIView alloc]initWithFrame:CGRectMake(105, 20, 105, 44)];
notificationsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
messagesBtn = [UIButton buttonWithType:UIButtonTypeCustom];

[notificationsBtn setImage:[UIImage imageNamed:@"notifications-icon.png"] forState:UIControlStateNormal];
[notificationsBtn setFrame:CGRectMake(35, 0, 35 , 44)];
[notificationsBtn addTarget:self action:@selector(showNotifications:) forControlEvents:UIControlEventTouchUpInside];

[messagesBtn setImage:[UIImage imageNamed:@"messages-icon.png"] forState:UIControlStateNormal];
[messagesBtn setFrame:CGRectMake(70, 0, 35 , 44)];
[messagesBtn addTarget:self action:@selector(showMessages:) forControlEvents:UIControlEventTouchUpInside];

[toolBar addSubview:notificationsBtn];
[toolBar addSubview:messagesBtn];

[_window.rootViewController.view addSubview:toolBar];
0 голосов
/ 14 марта 2012

Что следует понимать, так это то, что отображаемая панель UINavigationBar является свойством контроллера представления в верхней части иерархии контроллера навигации. Как вы понимаете, вы можете попытаться настроить titleView UINavigationBar каждого контроллера представления, например, на viewWillAppear. Вы можете получить доступ к панели навигации с помощью

self.navigationController.navigationBar

где self - ссылка на загруженный контроллер вида.

И для случая, когда вы хотите иметь постоянное представление где-то на экране, одно из решений заключается в следующем: объявите свойство в классе app-делегата, добавьте представление непосредственно в окно после корневого представления, вот так:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// something here ...

// root view controller
[window addSubview:myRootViewController.view];

// toolbar
MyToolbar * tb = [MyToolbar new];
tb.barStyle = UIBarStyleDefault;
[tb sizeToFit];
tb.frame = CGRectMake(0, 0, 320, 70);
[window addSubview:tb];
self.globalToolBar = tb;
[tb release];

Затем вы можете обновить панель инструментов (в данном случае это может быть любое представление в целом) из любого представления следующим образом:

[[[[UIApplication sharedApplication] delegate] globalToolBar] updateRightButtonItem]

Так что вам нужно создать подкласс UIToolBar с MyToolbar, добавить туда некоторые методы пользовательского интерфейса, такие как updateRightButtonItem, вам, вероятно, также потребуется создать делегат или обработать уведомления с панели инструментов, перехватывающие события на контроллере верхнего вида. 1012 *

Таким образом, представление контроллеров представления будет анимировано с помощью логики контроллера навигации, но панель инструментов является подпредставлением окна и не изменяется автоматически при выполнении действий навигации.

...