Добавить сегментированный элемент управления в панель навигации и сохранить заголовок с помощью кнопок
Я хочу добавить сегментированный элемент управления в панель навигации, но также сохранить заголовок и кнопки, например, в разделе покупки iOS 7 Appstore (пример)
Я попытался добавить сегментированный элемент управления в виде заголовка, а затем использовать приглашение в качестве заголовка, но затем кнопки находятся на том же уровне, что и сегментированный элемент управления.
Ответы
Ответ 1
Я попытался решить вашу проблему с помощью другого подхода, так как использование навигационной панели только не показалось вам работать (возможно, потому, что приложение AppStore использует частный api, но я недостаточно осведомлен, чтобы точно сказать..)
В любом случае я просто использовал панель инструментов, расположенную чуть ниже панели навигации, на которой я добавил сегментированный элемент управления, все внутри обычного UIViewController.
Вот как это выглядит в Раскадке:
![Storyboard]()
И это результат в Simulator:
![Simulator]()
Просто будьте осторожны, чтобы компенсировать представление таблицы вниз, чтобы учитывать вертикальное пространство, используемое панелью инструментов.
Надеюсь, это поможет!
Ответ 2
Я нашел два решения:
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;
}
}
Ответ 3
Вы можете найти панель навигации с 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
Ответ 4
Для этого вы можете использовать свойство подсказки для навигации. Просто установите свойство в раскадровке, как это, и панель навигации будет автоматически исчезать вверх и вниз. Единственный недостаток - текст немного мал.
![введите описание изображения здесь]()
Ответ 5
Я попытался сделать это в Xamarin.iOS, с iOS 6, вы можете наследовать UINavigationBar и добавить элементы управления, где вы хотите.
Ответ 6
Попробуйте создать подкласс UINavigationBar и позволить ему соответствовать протоколу UIToolbarDelegate. Затем в -init-методе создайте свой элемент управления сегментом, добавьте его на UIToolBar и установите его делегат в свой пользовательский класс UINavigationBar. Затем напишите эту магию:
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
Удачи!
Ответ 7
Мое решение было следующим:
Добавьте панель инструментов и сегментированный элемент управления в файл 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]()
Ответ 8
Я не полностью его реализовал, но следующее, что я планирую сделать. (ios7) Это будет означать, что заголовок и кнопки на одной панели навигации рядом.
В раскадровке добавьте пустой экран в панель навигации. Затем добавьте метку и сегментированный элемент управления к этому виду. Это позволяет вам добавить любой элемент управления, который вы хотите на навигационную панель. Пока пользовательский интерфейс работает, просто не подключил его. Просто хотел поделиться тем, что я нашел до сих пор.