Добавление представления над навигационной панелью

Я пытаюсь добиться эффекта, аналогичного тому, что наблюдается в новом приложении «Сообщения» (Safari тоже) на iOS 7, в результате чего в самой панели навигации есть индикатор выполнения:

Индикатор выполнения, видимый в навигационной панели в iOS 7

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

Рабочий код (без ограничений макета, поэтому он не корректирует изменения ориентации):

 - (void)commonInit { if (!self.progressIndicator) { self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)]; [self addSubview:self.progressIndicator]; } } 

Код, который я ожидал бы использовать (с добавлением NSLayoutConstraint s), но сбой:

 - (void)commonInit { if (!self.progressIndicator) { self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)]; [self addSubview:self.progressIndicator]; self.progressIndicator.translatesAutoresizingMaskIntoConstraints = NO; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[progressIndicator]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[progressIndicator(==3)]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]]; } } 

Ошибка, которую я испытываю при запуске кода с ограничениями макета, включена здесь в Gist. Если я не устанавливаю translatesAutoresizingMaskIntoConstraints = NO , тогда код работает, но указанные ограничения компоновки игнорируются в пользу ограничений маскировки авторезистентности.

Может ли кто-нибудь пролить свет?

PS Вначале я думал о добавлении индикатора выполнения в виде представления над UINavigationBar (так не в его иерархии вообще), но я не могу найти никакой информации о том, как позиционировать визуально над навигационной панелью (в координатах Z) , нет, спасибо).

Примечание. Я разместил это на форумах разработчиков Apple, но не получил ответа.

Хитрость заключается в том, чтобы добавить представление в titleView of navigationItem. Установите cliptobounds этого представления в НЕТ и добавьте в него представление прогресса.

 UIView *test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 128, 33)]; [test setBackgroundColor:[UIColor redColor]]; [test setClipsToBounds:NO]; // Add the progress view UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar]; [progressView setFrame:CGRectMake(-96, 36, 320, 2)]; [progressView setProgress:1.0]; [progressView setProgressTintColor:SYSTEM_BLUE]; [test addSubview:progressView]; self.navigationItem.titleView=test; 

Просто поставьте это представление в NavigationController, а не на NavigarionBar.

вы можете установить Titleview для своей навигационной панели … просто установите любой UIView в качестве заголовка навигационной панели. Затем вы можете установить любое подзапрос на этом UIView ..

 UIView *viewBar=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 800, 44)]; UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(50, 0, 50, 50)]; [label setText:@"Sending"]; [viewBar addSubview:label]; self.navigationItem.titleView=viewBar; 

Счастливое кодирование ….