Пользовательский titleView на UINavigationController неправильно анимирует - PullRequest
8 голосов
/ 13 сентября 2010

Я, наверное, здесь что-то не так делаю, потому что это выглядит немного глупо.
Я устанавливаю пользовательский titleView (в форме UILabel) на моем UINavigationController, который одинаков на каждой странице. Чтобы облегчить это, я создал функцию в моем делегате приложения для правильного отображения метки. Затем я вызываю эту функцию в любых подпредставлениях сразу после того, как помещаю ее в стек навигации.
Вот код (который, вероятно, имеет больше смысла, чем мое объяснение):

//In MyAppDelegate.m:
- (void)showTitleForNavigationController:(UINavigationController*) navController {
    UILabel *label = [[UILabel alloc] init];
    // set up label attributes
    // ...
    [label sizeToFit]; //without this line my label won't show at all
    [navController.navigationBar.topItem setTitleView:label];
    [label release];
}

// In SomeViewController.m, when pushing another controller onto the stack:
    UIViewController *otherViewController = //initialize other view controller;
    [self.navigationController pushViewController:otherViewController animated:YES];
    [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] showTitleForNavigationController:otherViewController.navigationController];

Моя проблема в том, что когда я помещаю следующий контроллер представления в стек, а новый контроллер плавно скользит по всей длине анимации, метка прикрепляется к верхнему левому углу, прежде чем окончательно встать на место после ее завершения , Это выглядит действительно странно и безобразно. Как правильно настроить метку, чтобы она плавно скользила от следующего вида? Конечно, я скучаю по чему-то простому ...

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

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

В моем случае я устанавливаю пользовательский UILabel в качестве заголовка, и я понял, что только когда я устанавливаю свойство titleview в методе viewDidLoad, он корректно анимируется.Однако в некоторых случаях я еще не знал заголовок в моем viewDidLoad (в некоторых случаях мне нужно было использовать заголовок из http-запроса, например).Таким образом, я решил для этих случаев установить свойство titleview для моей пользовательской метки с текстом @ "" в viewDidLoad, и всякий раз, когда я получал реальный заголовок, я менял только текстовое свойство своей пользовательской метки.

- (void)viewDidLoad {
   [super viewDidLoad];
   // Do any additional setup after loading the view from its nib.

   //set temporary title, the MBMUINavigationBarTitleView is a UIView subclass whose  viewWithTitle method returns an autoreleased UIlabel with my custom settings, custom font etc.
   self.navigationItem.titleView = [MBMUINavigationBarTitleView viewWithTitle:@" "];
}

//somewhere later, when I have the real title
UILabel* titleLabel = (UILabel*)self.navigationItem.titleView;
[titleLabel setText:theRealTitle];
0 голосов
/ 23 февраля 2015

Я был в ситуации, аналогичной ylva, используя экземпляр пользовательского текстового класса для свойства UINavigationItem's titleView.Тем не менее, я обнаружил, что его настройка в viewDidLoad не разрешила проблему анимации.

Мой обходной путь к проблеме заключался в том, чтобы подождать, пока рассматриваемый контроллер представления был извлечен из стека контроллера навигации, и на этомУдалите UINavigationItem's custom titleView, чтобы его вообще не нужно было анимировать.

Когда мой подкласс UINavigationController получает сообщение popViewControllerAnimated:, я копирую текст заголовка из своего пользовательского текстового поля (UINavigationItem's titleView) в свойство UINavigationItem's title и устанавливаюtitleView свойство к нулю.Затем UINavigationController идет вперед и выскакивает из контроллера представления, и анимируется только заголовок стандартной панели навигации (не мой пользовательский заголовок), без сбоев.

0 голосов
/ 21 марта 2011

В итоге я использовал изображение с текстом, включенным в качестве фона для заголовка, поэтому вместо того, чтобы плавно анимировать, как я хотел изначально, это вообще не анимация. Учитывая, что это везде одно и то же, это не так уж важно.

...