Измените высоту элементов NavigationBar и UIBarButtonItem внутри него в Cocoa Touch
Я полагаю, что это не строго соответствует руководящим принципам Apple, но я думаю, это должно быть возможно каким-то образом. Я бы хотел изменить высоту навигационной панели внутри UINavigationController и высоту элементов UIBarButtonItem внутри этого бара.
Используя трюк из этого вопроса Мне удалось изменить высоту навигационной панели, но я не вижу способа регулировки высоты элементов панели.
Если кто-нибудь знает, как изменить размер элементов панели, пожалуйста, помогите мне.
Ответы
Ответ 1
Возможно, этот урок о настраиваемом навигаторе поможет вам: Воспроизведение панели навигации iBooks wood themed
Если вы создаете BarButtonItem
с UIImageView
, возможно, вы можете изменить frameize/boundsize пользовательского UIImageView
UIImageView* imageView = [[[UIImageView alloc] initWithFrame:navigationController.navigationBar.frame] autorelease];
imageView.contentMode = UIViewContentModeLeft;
imageView.image = [UIImage imageNamed:@"NavBar-iPhone.png"];
[navigationController.navigationBar insertSubview:imageView atIndex:0];
Таким образом, для вашей потребности вы дадите соответствующие методы -initWithFrame
.
Ответ 2
Это мое решение. Он работает очень хорошо.
@interface UINavigationBar (CustomHeight)
@end
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
// Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
CGSize newSize = CGSizeMake(self.frame.size.width, 40);
return newSize;
}
-(void)layoutSubviews {
[super layoutSubviews];
// Make items on navigation bar vertically centered.
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i, [view description]);
i++;
if (i == 0)
continue;
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
Ответ 3
static CGFloat const CustomNavigationBarHeight = 74;
@implementation WTNavigationBar
- (CGSize)sizeThatFits:(CGSize)size{
size.width = 1024;
size.height = CustomNavigationBarHeight;
return size;
}
-(void)layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
SFLog(@"view.class=%@",[view class]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationItemButtonView")]) {
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
}
@end
в моем приложении iPad, которое имеет фиксированную ориентацию ландшафта, я обнаружил, что мне нужно жестко задавать ширину размера
Ответ 4
Мне удалось сделать что-то подобное путем подклассификации UINavigationBar
и переопределения -layoutSubviews
. Код выглядит так:
-(void)layoutSubviews {
[super layoutSubviews];
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i++, [view description]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
view.frame = CGRectMake(0, 0, 100, 50);
}
}
}
Если вам нужно знать, как подкласс UINavigationBar
, посмотрите этот очень хороший ответ.
Я не уверен в части NSClassFromString (@"UINavigationButton)]. Это работает, но я сделал это как эксперимент, и я не уверен, будет ли это одобрено Apple. Я надеюсь, что кто-то с лучшими знаниями может пролить свет.
Ответ 5
Для UINavigationbar
В iOS SDK 4.3 и выше существует способ (взломать), чтобы изменить высоту UINavigationBar.
Чтобы изменить высоту UINavigationController, измените его размер кадра в viewWillAppear:animated:
. Затем высота будет настраиваться по всему приложению.
Для UIBarButtonItems
Я на самом деле сталкивался с этим сам, и единственное, что я мог придумать, - это использование initWithCustomView и передача в UIButton с определенным фреймом.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
/*
* Insert button styling
*/
button.frame = CGRectMake(0, 0, width, height);
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
В противном случае UIBarButtonItem имеет свойство ширины, которое может быть установлено, но, к сожалению, не является свойством высоты. Еще одна замечательная вещь, которую я сделал с initWithCustomView, - это перейти на панель инструментов с помощью кнопки и других вещей, таких как индикаторы активности. Надеюсь, это поможет.
Ответ 6
Как сильно вы этого хотите? И как тонкий (или толстый) вы хотите сделать свой навигатор?
Один из подходов заключался бы в том, чтобы установить преобразование навигатора в шкалу и перевести его. Если вы слишком сильно масштабируете текст заголовка и кнопки, он будет выглядеть неуклюжим, но если вам нужно только побрить несколько пикселей, вы можете быть в порядке.
Здесь результат масштабирования составляет 75% от полной высоты (33 пиксела высотой):
![enter image description here]()
И код, который произвел это:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"Thin Navigation Bar";
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"Press Me" style:UIBarButtonItemStyleBordered target: nil action: NULL ] autorelease];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.navigationController.navigationBar.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
CGRect r = self.view.frame;
r.origin.y -= cy;
r.size.height += cy;
self.view.frame = r;
}
Теперь у этого есть ряд проблем, которые могут быть или не быть разрешимыми. # 1 заключается в том, что вы сражаетесь с UINavigationController для определения размера и расположения навигационных панелей и представлений диспетчера представлений. Анимация между контроллерами представлений, которые используют этот метод, вероятно, будет выглядеть странно.
Мне было бы интересно, если бы вы могли решить связанные с этим проблемы...
Одна последняя мысль: если вы не используете UINavigationController, тогда на самом деле не так много проблем с этим, кроме сжатого текста. Или вы можете использовать контроллер навигации, но скрыть навигационную панель по умолчанию и добавить тонкую навигационную панель к каждому из представлений контроллера детского просмотра. Вы даже можете подклассифицировать UINavigationBar и установить преобразование изнутри:
@interface TSThinNavBar : UINavigationBar
{
}
@end
@implementation TSThinNavBar
// assuming we'll always be constructed from a nib
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if ( self != nil )
{
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
return self;
}
@end