Добавить сегментированный элемент управления в панель навигации и сохранить заголовок с помощью кнопок

Я хочу добавить сегментированный элемент управления в панель навигации, но также сохранить заголовок и кнопки, например, в разделе покупки iOS 7 Appstore ( пример )

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

Я попытался решить вашу проблему, используя другой подход, так как использование навигационной панели только не показалось вам работать (возможно, это связано с тем, что приложение AppStore использует частный api, но я недостаточно осведомлен, чтобы точно сказать …) В любом случае Я просто использовал панель инструментов, расположенную чуть ниже панели навигации, на которой я добавил сегментированный элемент управления, все внутри обычного UIViewController.

Вот как это выглядит в Раскадке: Раскадровка

И это результат в Simulator:

имитатор

Просто будьте осторожны, чтобы компенсировать представление таблицы вниз, чтобы учитывать вертикальное пространство, используемое панелью инструментов. Надеюсь это поможет!

Я нашел два решения:

1) Как было предложено neural5torm, вы можете добавить сегментированный элемент управления в UIView с тем же фоновым цветом панели навигации

Вы можете удалить линию волос UINavigationBar таким образом:

for (UIView *view in self.navigationController.navigationBar.subviews) { for (UIView *view2 in view.subviews) { if ([view2 isKindOfClass:[UIImageView class]]) { [view2 removeFromSuperview]; } } } 

Это нормально для непрозрачной навигационной панели.

Если вы хотите полупрозрачную панель навигации:
2) Подкласс UINavigationBar для создания более высокого бара путем переопределения sizeThatFits

 - (CGSize)sizeThatFits:(CGSize)size { size.width = self.frame.size.width; size.height = your height (probably 88.0f); return size; } 

Чтобы использовать свою настраиваемую панель навигации:

 UINavigationController *navController = [[UINavigationController alloc] initWithNavigationBarClass:[YouNavigationBar class] toolbarClass:nil]; [navController setViewControllers:@[viewController]]; 

Элементы заголовка и кнопки будут внизу. Отрегулируйте их вертикальные положения (в начале настраиваемой панели навигации или через внешний прокси)

 // Title view [self setTitleVerticalPositionAdjustment:-dy forBarMetrics:UIBarMetricsDefault]; // Button item as icon/image [[UIBarButtonItem appearanceWhenContainedIn:[YourCustomNavigationBar class], nil] setBackgroundVerticalPositionAdjustment:-dy forBarMetrics:UIBarMetricsDefault]; 

Посмотрите на ссылку класса UIBarButtonItem, также есть setTitlePositionAdjustment и другие методы для кнопки «Назад»

Когда вы создаете сегментированный элемент управления, добавьте его в панель навигации

 [self.navigationController.navigationBar addSubview:segmentedControl]; 

Сегментированный элемент управления будет наверху. Отрегулируйте его вертикальное положение путем переопределения didAddSubview в пользовательской панели навигации

 - (void)didAddSubview:(UIView *)subview { [super didAddSubview:subview]; if ([subview isKindOfClass:[UISegmentedControl class]]) { CGRect frame = subview.frame; frame.origin.y += your extra height (probably 44.0f); subview.frame = frame; } } 

Вы можете найти панель навигации с UISegmentedControl в примере Apple Sample Code: https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

Вот моя интерпретация этого кода (создайте программно):

 // File MySegmController.h @interface MySegmController : UIViewController @end // File MySegmController.m #import "MySegmController.h" @interface MyNavBarView : UIView @end @interface MySegmController ()<UITableViewDataSource, UITableViewDelegate> { UISegmentedControl* _segm; UITableView* _table; } @end #define SEGM_WIDTH 250 @implementation MySegmController - (void)loadView { [super loadView]; self.view.backgroundColor = [UIColor whiteColor]; self.title = @"Title"; float w = self.view.bounds.size.width; NSArray* items = [[NSArray alloc] initWithObjects: @"One", @"Two", @"Three", nil]; _segm = [[UISegmentedControl alloc] initWithItems: items]; [items release]; [_segm sizeToFit]; _segm.frame = CGRectMake((w - SEGM_WIDTH) / 2, 0, SEGM_WIDTH, _segm.bounds.size.height); _segm.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; _segm.selectedSegmentIndex = 0; MyNavBarView* topView = [[MyNavBarView alloc] initWithFrame: CGRectMake(0, 0, w, _segm.bounds.size.height + 10)]; topView.backgroundColor = [UIColor whiteColor]; topView.autoresizingMask = UIViewAutoresizingFlexibleWidth; [topView addSubview: _segm]; [_segm release]; _table = [[UITableView alloc] initWithFrame: CGRectMake(0, topView.bounds.size.height, w, self.view.bounds.size.height - topView.bounds.size.height) style: UITableViewStylePlain]; _table.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; _table.dataSource = self; _table.delegate = self; [self.view addSubview: _table]; [_table release]; // add topView AFTER _table because topView have a shadow [self.view addSubview: topView]; [topView release]; } - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.navigationBar.translucent = NO; // pixel_transp.png - 1x1 image with transparent background self.navigationController.navigationBar.shadowImage = [UIImage imageNamed: @"pixel_transp"]; // pixel.png - 1x1 image with white background [self.navigationController.navigationBar setBackgroundImage: [UIImage imageNamed: @"pixel"] forBarMetrics: UIBarMetricsDefault]; UIBarButtonItem* bt = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel target: self action: @selector(onCancel)]; self.navigationItem.rightBarButtonItem = bt; [bt release]; } - (void)onCancel { [self.presentingViewController dismissViewControllerAnimated: YES completion: NULL]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"MyId"]; if (!cell) cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: @"MyId"] autorelease]; cell.textLabel.text = @"text"; return cell; } @end @implementation MyNavBarView - (void)willMoveToWindow: (UIWindow *)newWindow { self.layer.shadowOffset = CGSizeMake(0, 1.0f / UIScreen.mainScreen.scale); self.layer.shadowRadius = 0; self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowOpacity = 0.25f; } @end 

Для этого вы можете использовать свойство подсказки для навигации. Просто установите свойство в раскадровке, как это, и панель навигации будет автоматически исчезать вверх и вниз. Единственный недостаток – текст немного мал.

введите описание изображения здесь

Я попытался сделать это в Xamarin.iOS, с iOS 6, вы можете наследовать UINavigationBar и добавлять элементы управления, где хотите.

Попробуйте создать подкласс UINavigationBar и позволить ему соответствовать протоколу UIToolbarDelegate. Затем в -init-методе создайте свой элемент управления сегментом, добавьте его на UIToolBar и установите его делегат в свой пользовательский класс UINavigationBar. Затем напишите эту магию:

 - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar { return UIBarPositionTopAttached; } 

Удачи!

Я не полностью его реализовал, но вот что я планирую сделать. (ios7) Это будет иметь заголовок и кнопки на одной панели навигации рядом.

В раскадровке добавьте пустой экран в панель навигации. Затем добавьте метку и сегментированный элемент управления к этому виду. Это позволяет вам добавить любой элемент управления, который вы хотите на навигационную панель. Пока пользовательский интерфейс работает, просто не подключил его. Просто хотел поделиться тем, что я нашел до сих пор.

Мое решение было так:
Добавьте панель инструментов и сегментированный элемент управления в ваш xib файл. Настройте его так, как вам нужно, и подключите его к розетке вашего контроллера:

введите описание изображения здесь

Затем поместите это в метод viewDidLoad :

 - (void)viewDidLoad { [super viewDidLoad]; // add after your setup code UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl]; self.navigationItem.rightBarButtonItem = item; } 

введите описание изображения здесь

  • Как установить фоновое изображение UISegmentedControl
  • UISegmentedControl, встроенный в UINavigationBar / Item
  • Изменение цвета выбранного сегмента управления
  • UISegmentedControl ошибка делителя
  • Несколько строк текста отображаются после щелчка сегмента UISegmentedControl, но не изначально - ОБНОВЛЕННЫЙ КОД
  • UISegmentedControl неправильная обработка настроек
  • Цветовой оттенок UIButton Image
  • UISegmentedControl с значком или выделение
  • Objective C UISegmentedControl Number Значки, покрытые цветом hightlight
  • Сегментированное управление, изменение непрозрачности оттенка, но не границы
  • UISegmentedControl в образе делителя iOS 7 неверно во время анимации
  • Interesting Posts

    Как передать права собственности на @autoreleasepool с помощью ARC

    AVplayer Audio маршрутизация на динамики и наушники

    Наложение камеры с помощью User-Photo не сохраняется как отредактировано

    Как изменить цвет панели состояния iOS в контроллере детского представления

    Как вы используете Core Location без разрешения пользователя или предоставления разрешения?

    Насколько эффективно индивидуальное преобразование контроллеров представлений в ARC?

    Отчеты о сбоях VectorKit с MKMapSnapshotter на iOS

    NSURLSessionTask completeTask никогда не получает вызов в основной очереди с использованием GCD

    IndexedDB медленно при вставке

    iPad app – + , вызываемый в транзакции, останавливающей приложение

    Как получить ALAssetRepresentation совместного фотопотока ALAsset?

    Как получить дату создания контакта?

    Amazon Simple Notification Service с пользовательской полезной нагрузкой iOS не так проста

    Очистить кеш в iOS: удаление данных приложения из других приложений

    Почему простой контроллер модального представления отстает при представлении и увольнении?

    Давайте будем гением компьютера.