Вопрос по uinavigationbar, iphone, height – iPhone - Как установить высоту uinavigationbar?

30

Я хочу сделать верхнюю часть навигации немного меньше. Как бы вы достигли этого? Это то, что я пробовал до сих пор, но, как вы можете видеть, хотя я делаю панель навигации меньше, область, которую она занимала, все еще там (черная).

[window addSubview:[navigationController view]];
navigationController.view.frame = CGRectMake(0, 100, 320, 280);
navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 20);
navigationController.view.backgroundColor = [UIColor blackColor];
[window makeKeyAndVisible];

Вы должны выбрать ответ - я бы предложил Макросс, поскольку все другие простые ответы приводят к тому, что подпредставления перемещаются вниз. David H
Это больше меня беспокоит. Может быть, я хотел сделать Navbar больше. Если я сделаю это сейчас, он охватит весь контент (в данном случае это табличное представление). quano
Почему вы хотите изменить стандарт, вместо этого я думаю, что вы должны разработать свой вид, чтобы соответствовать оставшемуся месту. Это нарушает [Руководство по взаимодействию с людьми] [1]. [1]:developer.apple.com/iphone/library/documentation/UserExperience/... Hoang Pham

Ваш Ответ

9   ответов
1

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

Есть какие-нибудь обновления по этому вопросу? У меня точно такая же проблема. Или индивидуальный дизайн панели навигации должен быть 44px? Ryan Ye
@Ben Gottlieb @benvolioT Итак, в заключение, есть ли способ изменить высоту панели навигации? aneuryzm
Я также обнаружил, что изменение размера панели навигации не работает в сочетании с UITableViews, UITabBarControllers и т. Д. Кажется, что слишком многое жестко запрограммировано Apple. (Я попытался установить высоту tabBar в UINavigationControllerDelegate). benvolioT
иерархия представления NavController-with-navBar немного сложна. Есть родительское представление, navBar, а затем содержимое, сохраненное в представлении вашего контроллера представления. Если вы измените размер навигационной панели, она не обязательно изменит размер вашего контроллера. Если вы измените размер материала, вы сможете лучше контролировать то, что будет перетекать в нужное место. Ben Gottlieb
Установка высоты не была проблемой, более того, в остальном контент (просмотр таблицы), похоже, не корректирует свою позицию, когда панель навигации меняет свой размер. Как добавление моего пользовательского navbar повлияет на содержимое? quano
79

Создайте категорию UINavigationBar с нестандартным размером.

@implementation UINavigationBar (customNav)
  - (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width,70);
    return newSize;
  }
@end
Используйте подкласс вместо категории, здесь вы меняете базовую реализацию и любой код, использующий его, потеряет базовую реализацию. Жаль ! nverinaud
Отличная находка! Может быть, лучше использовать, что супер возвращает, а затем изменить свойство высоты? Редактировать: только что понял, что не будет работать в категории, только в подклассе. aegzorz
Для тех, кто хочет использовать подход, предложенный @aegzorz, использование подкласса не составляет проблем, если использовать метод, предложенный Себастьяном Селисом в этой статье:sebastiancelis.com/2012/03/05/subclassing-hard-to-reach-classes Ivan Vučica
6

можете использовать категорию, а в Swift вы можете использовать расширение.

extension UINavigationBar {
    public override func sizeThatFits(size: CGSize) -> CGSize {
        return CGSize(width: frame.width, height: 70)
    }
}
1

ествующую высоту в качестве отправной точки и добавляет к ней.

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

class TallBar: UINavigationBar {
    override func sizeThatFits(size: CGSize) -> CGSize {
        var size = super.sizeThatFits(size)
        size.height += 20
        return size
    }
}
Я только что получил решение @mackross ниже, работающее в iOS9 (не использующее изображения, но использующее те же переопределения). Мне нужно создать более высокую навигационную панель с кнопками и заголовком в нормальном положении. Я провел большую часть утра, делая это (PITA). В любом случае, то, что у вас есть, является необходимым компонентом решения! David H
Это правда, но в моем случае это было именно то, что я пытался сделать. Я поместил небольшой сегментированный элемент управления над панелью навигации, а сами кнопки отображаются ниже. Но хороший улов - возможно, не лучшее решение, если кто-то пытается просто добавить пространство под существующей областью панели навигации. Matthew Wakefield
Справедливое предупреждение - это решение больше не будет работать в iOS 11. Matthew Wakefield
Единственная проблема заключается в том, что кнопки заголовка и панели перемещаются вниз - все новое пространство находится сверху. David H
4

- (CGSize)sizeThatFits:(CGSize)size
{
     return CGSizeMake(self.superview.bounds.size.width, 62.0f);
}
7

создать подкласс Uinavigation bar.

import UIKit

class higherNavBar: UINavigationBar {

override func sizeThatFits(size: CGSize) -> CGSize {
    var newSize:CGSize = CGSizeMake(self.frame.size.width, 87)
    return newSize
}

С обеих сторон будет две пустые полосы, я изменил ширину на точное число, чтобы оно работало.

Однако заголовок и кнопка возврата выровнены по низу.

«Однако заголовок и кнопка« Назад »выровнены по низу», каково их решение? Khurram Shehzad
не работает на iOS12 Peter Lapisu
0

Я создал новый класс, который наследуется от UINavigationBar

Я переопределяю следующий метод:

 (void)setBounds:(CGRect)bounds {

   [super setBounds:bounds];
   self.frame = CGRectMake(0, 0, 320, 54);


  }

3. Чтобы получить пользовательский фон панели навигации, я переопределил следующий метод:

-(void)drawRect:(CGRect)rect {

    [super drawRect:rect];

    UIImage *img = [UIImage imageNamed:@"header.png"];

    [img drawInRect:CGRectMake(0,0, self.frame.size.width, self.frame.size.height)];


}
В xib-файле я изменил класс UINavigationBar панели навигации по умолчанию на мой класс.
Это очень близко, однако оно будет перекрывать базовый вид, а не сдвигать его для выравнивания с панелью навигации. rwyland
1

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

class UINaviationBarCustomHeight: UINavigationBar {

// Note: this must be set before the navigation controller is drawn (before sizeThatFits is called),
// so set in IB or viewDidLoad of the navigation controller
@IBInspectable var barHeight: CGFloat = -1
@IBInspectable var barHeightPad: CGFloat = -1

override func sizeThatFits(size: CGSize) -> CGSize {
    var customSize = super.sizeThatFits(size)
    let stockHeight = customSize.height
    if (UIDevice().userInterfaceIdiom == .Pad && barHeightPad > 0) {
        customSize.height = barHeightPad
    }
    else if (barHeight > 0) {
        customSize.height = barHeight
    }
    // re-center everything
    transform = CGAffineTransformMakeTranslation(0, (stockHeight - customSize.height) / 2)
    resetBackgroundImageFrame()
    return customSize
}

override func setBackgroundImage(backgroundImage: UIImage?, forBarPosition barPosition: UIBarPosition, barMetrics: UIBarMetrics) {
    super.setBackgroundImage(backgroundImage, forBarPosition: barPosition, barMetrics: barMetrics)
    resetBackgroundImageFrame()
}

private func resetBackgroundImageFrame() {
    if let bg = valueForKey("backgroundView") as? UIView {
        var frame = bg.frame
        frame.origin.y = -transform.ty
        if (barPosition == .TopAttached) {
            frame.origin.y -= UIApplication.sharedApplication().statusBarFrame.height
        }
        bg.frame = frame
    }
}
}
24

я успешно создал большую панель навигации на iOS 5.x и iOS 6.x на iPad. Это дает мне большую панель навигации, но не нарушает все анимации.

static CGFloat const CustomNavigationBarHeight = 62;
static CGFloat const NavigationBarHeight = 44;
static CGFloat const CustomNavigationBarHeightDelta = CustomNavigationBarHeight - NavigationBarHeight;

@implementation HINavigationBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
//      UIColor *titleColor = [[HITheme currentTheme] fontColorForLabelForLocation:HIThemeLabelNavigationTitle];
//      UIFont *titleFont = [[HITheme currentTheme] fontForLabelForLocation:HIThemeLabelNavigationTitle];

//      [self setTitleTextAttributes:@{ UITextAttributeFont : titleFont, UITextAttributeTextColor : titleColor }];

        CGAffineTransform translate = CGAffineTransformMakeTranslation(0, -CustomNavigationBarHeightDelta / 2.0);
        self.transform = translate;
        [self resetBackgroundImageFrame];

    }
    return self;
}

- (void)resetBackgroundImageFrame
{
    for (UIView *view in self.subviews) {
        if ([NSStringFromClass([view class]) rangeOfString:@"BarBackground"].length != 0) {
            view.frame = CGRectMake(0, CustomNavigationBarHeightDelta / 2.0, self.bounds.size.width, self.bounds.size.height);
        }
    }
}

- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
{
    [super setBackgroundImage:backgroundImage forBarMetrics:barMetrics];
    [self resetBackgroundImageFrame];
}

- (CGSize)sizeThatFits:(CGSize)size
{
    size.width = self.frame.size.width;
    size.height = CustomNavigationBarHeight;
    return size;
}

- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    [self resetBackgroundImageFrame];
}



@end
Хорошее решение с преобразованием. Спасибо! У меня есть 2 варианта получения фонового изображения в коде resetBackgroundImageFrame: 1, [self.subview objectAtIndex: 0] - мы можем с уверенностью предположить, что фоновое представление будет в нижней части стека - это фон, верно? 2, используйте KVO [self valueForKey: @ "backgroundView"], этот подход я решил использовать. Michal
как применить этот подкласс? jturolla
Если вы загружаете свой UINavigationBar / UINavigationController из xib / storyboard, вам необходимо переопределить- (id)initWithCoder:(NSCoder *)aDecoder вместо. Kyle Fleming
Метод initWithNavigationBarClass в UINavigationController ... mackross
Это прекрасное решение. Я просто добавил это в свой пользовательский класс и запустил свое приложение; работает очень хорошо (iOS 6, еще не тестировалась на iOS 5). Mackey18

Похожие вопросы