2013-09-15 4 views
24

Я хочу добавить сегментированное управление навигационной панели, но и сохранить название и кнопки, как в прошивке 7 Appstore купил участок (example)Добавить сегментированное управление навигационной панели и сохранить титул с кнопками

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

+0

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

ответ

11

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

Это то, что он выглядит в раскадровке: Storyboard

И это результат в симуляторе:

Simulator

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

+6

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

+0

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

+0

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

2

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

14

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

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; 
    } 
} 
+1

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

2

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

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

Удачи вам!

+0

Можете ли вы расширить это? Предлагаете ли вы создать 'UIToolbar', добавив его в качестве поднабора в' UINavigationBar' и добавив 'UISegmentedControl' на панель инструментов? Если нет, где добавляется панель инструментов? – Joey

0

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

enter image description here

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // add after your setup code 
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl]; 

    self.navigationItem.rightBarButtonItem = item; 
} 

enter image description here

0

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

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

9

Вы можете найти панель навигации с UISegmentedControl в компании Apple Пример кода: 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 
+0

Как это работает, когда segmentedControls показывает три разных диспетчера просмотра? – Koen

+0

В этом коде мы не показываем разные viewControllers: мы просто изменяем содержимое _table, когда вы выбираете другой элемент в segmentedControl – pigmasha

+0

Да, это имеет смысл. Кстати, я действительно опубликовал вопрос о моей проблеме час назад: http://stackoverflow.com/questions/31761396/uinavigationbar-with-uisegmentedcontrol-partially-covers-childviews – Koen

6

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

enter image description here

Смежные вопросы