Подтвердить что ты не робот

Измените высоту элементов NavigationBar и UIBarButtonItem внутри него в Cocoa Touch

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

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

Если кто-нибудь знает, как изменить размер элементов панели, пожалуйста, помогите мне.

4b9b3361

Ответ 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