изменение высоты UITabBar в iOS7/8?

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

однако, когда я пытаюсь установить высоту, она остается прежней

self.tabBar.frame.height = 40

нам не разрешено изменять высоту панели вкладок? и если да, то какая хорошая альтернатива? с помощью панели инструментов?


person 3254523    schedule 24.06.2014    source источник


Ответы (8)


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

class TabBar: UITabBar {

     override func sizeThatFits(size: CGSize) -> CGSize {
         var sizeThatFits = super.sizeThatFits(size)
         sizeThatFits.height = 38

         return sizeThatFits
     }
}
person Melly    schedule 24.01.2015
comment
Вы дважды вызываете реализацию super. Первый не нужен. - person Dave Batton; 24.04.2015
comment
Нет необходимости в подклассах, создав простое расширение - person der_michael; 25.02.2016

Кажется, все говорят, что это не может быть сделано легко

В вашей раскадровке дайте вашему UITabBar собственное имя подкласса, а затем реализуйте подкласс со следующим

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

@implementation MyTabBar

-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = 100;

    return sizeThatFits;
}

@end

введите здесь описание изображения

person SomeGuy    schedule 15.12.2014
comment
Большое спасибо за это! Я добавил перевод Swift ниже. - person Melly; 25.01.2015
comment
Это золото. Так просто и так эффективно! :D - person napolux; 18.03.2015
comment
@Lev, он все еще работает, убедитесь, что вы установили собственный класс UITabBar в Interface Builder. - person SomeGuy; 29.05.2015
comment
@SomeGuy Да... Я уверен. Я настроил ведение журнала в методе, чтобы увидеть, что он вызывается. Он есть, но ни на что не влияет. Я пробовал разные числа от 1 до 100, и ни один из них не дал никакого эффекта, но метод продолжает вызываться. Пробовал и в эмуляторе и на телефоне (8.3). - person Lev; 29.05.2015
comment
@SomeGuy, есть что-то еще, что нужно сделать или что не нужно делать? Что-нибудь, связанное с его ограничениями в раскадровке? - person Lev; 29.05.2015
comment
@Lev Я полагаю, у вас включена автоматическая компоновка. Это потребует переопределения функции переопределения innerContentSize() -> CGSize { var sizeThatFits = super.frame.size sizeThatFits.height = 120 return sizeThatFits } - person jernkuan; 24.07.2015

Для Swift 3 и xcode 8

extension UITabBar {
     override open func sizeThatFits(_ size: CGSize) -> CGSize {
     var sizeThatFits = super.sizeThatFits(size)
     sizeThatFits.height = 80 // adjust your size here
     return sizeThatFits
    }
 }
person Museer Ahamad Ansari    schedule 17.12.2016

В вашем UITabBarController

- (void)viewWillLayoutSubviews {
    CGRect tabFrame = self.tabBar.frame;
    tabFrame.size.height = 80;
    tabFrame.origin.y = self.view.frame.size.height - 80;
    self.tabBar.frame = tabFrame; 
}
person jose920405    schedule 15.04.2015

В Swift это даже проще, чем все решения, предложенные выше, с использованием расширений для UITabBar, без необходимости создания подклассов:

extension UITabBar {

    override public func sizeThatFits(size: CGSize) -> CGSize {
        super.sizeThatFits(size)
        var sizeThatFits = super.sizeThatFits(size)
        sizeThatFits.height = <Insert your height here>
        return sizeThatFits
    }
}
person der_michael    schedule 25.02.2016
comment
Это отлично работает, однако элементы UITabBar не изменяются соответствующим образом. Как это может быть сделано? - person damianesteban; 27.03.2016
comment
Расширения не должны использоваться для переопределения функциональности. Это неопределенное поведение. - person rmaddy; 14.12.2017

Если у вас включена автоматическая компоновка, вам нужно вместо этого переопределить instrinsicContentSize.

Правильное использование innerContentSize и sizeThatFits: в подклассе UIView с автомакетом

class TabBar: UITabBar {
    override func intrinsicContentSize() -> CGSize {
        var intrinsicSize = super.frame.size

        intrinsicSize.height = 120
        return intrinsicSize
     }
}
person jernkuan    schedule 24.07.2015
comment
Обратите внимание, что InfinityContentSize теперь является вычисляемым свойством в более новых версиях Swift. См.: stackoverflow.com/questions/38881151/ - person Jason Machacek; 17.04.2019

TabBar принадлежит не разработчику, а фреймворку. Он будет бороться с вами, чтобы убедиться, что tabBar остается той же высоты. Если вы хотите обойти это, вы можете создать свою собственную панель инструментов и добавить ограничения автомакета к ее высоте, чтобы заставить ее оставаться на той высоте, которую вы хотите.

person InkGolem    schedule 24.06.2014

Если вы используете iOS 11, вам поможет следующее.

-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = 60;

    if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.keyWindow;
        CGFloat bottomPadding = window.safeAreaInsets.bottom;
        sizeThatFits.height += bottomPadding;
    }

    return sizeThatFits;
}

В основном нужно покрыть безопасную область, иначе высота панели вкладок на iPhone X будет низкой.

person vishal dharankar    schedule 14.12.2017