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

Изменение высоты UITabBar

Я использую UITabBarController в качестве корневого представления и приложение поддерживает iOS 6 и выше. Иерархия классов проекта, как показано ниже.

UITabBarController
  - tab1
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
  - tab2
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
      .
  - tab3
    - UIViewController
  - tab4
    - UIViewController

Я использовал приведенный ниже код для изменения высоты UITabBar в одном из UIViewController (который находится внутри UINavigationController) в вышеприведенной иерархии.

CGRect tabbarFrame = self.tabBarController.tabBar.frame;
tabbarFrame.size.height += 60;
self.tabBarController.tabBar.frame = tabbarFrame;

Но это не меняет высоту. UITabBar отображается с высотой по умолчанию. Хотя регистрация его значения печатает измененное значение, как показано ниже.

<UITabBar: 0xb528f60; frame = (0 431; 320 109); autoresize = W+TM; layer = <CALayer: 0xb529080>>

Как я могу изменить высоту UITabBar для достижения чего-то вроде этого:?

enter image description here

4b9b3361

Ответ 1

Высота панели вкладок является постоянной, установленной Apple, поэтому вы не можете ее изменить.

Ответ 2

Я столкнулся с этой проблемой и смог ее решить.

Вы должны добавить следующий код в свой подкласс класса UITabBarController.

const CGFloat kBarHeight = 80;

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    CGRect tabFrame = self.tabBar.frame; //self.TabBar is IBOutlet of your TabBar
    tabFrame.size.height = kBarHeight;
    tabFrame.origin.y = self.view.frame.size.height - kBarHeight;
    self.tabBar.frame = tabFrame;
}

Swift:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    tabBar.frame.size.height = kBarHeight
    tabBar.frame.origin.y = view.frame.height - kBarHeight
}

Ответ 3

Для iOS 8.2, Xcode 6.2 Язык Swift:

Создайте "DNMainTabVC.swift" (файл DeveloperNameMainTabViewController.swift) для вашего UITabBarController (типа UITabBarController) и подключите его к VC раскадровки.

Добавьте следующие строки:

override func viewWillLayoutSubviews() {
    var tabFrame = self.tabBar.frame
    // - 40 is editable , the default value is 49 px, below lowers the tabbar and above increases the tab bar size
    tabFrame.size.height = 40
    tabFrame.origin.y = self.view.frame.size.height - 40
    self.tabBar.frame = tabFrame
}

Это сработало для меня.

Ответ 4

Swift3.0, Swift 4.0

Pre-iPhone X высота панели вкладок по умолчанию: 49pt

iPhone X высота строки вкладки по умолчанию: 83pt

Универсальное решение, поддерживающее каждое устройство iOS, включая размер экрана iPhone X, будет выглядеть следующим образом:

  • Захват высоты UITabBar по умолчанию:

    fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
    
  • Отрегулируйте высоту UITabBar:

        override func viewWillLayoutSubviews() {
            super.viewWillLayoutSubviews()
    
            let newTabBarHeight = defaultTabBarHeight + 16.0
    
            var newFrame = tabBar.frame
            newFrame.size.height = newTabBarHeight
            newFrame.origin.y = view.frame.size.height - newTabBarHeight
    
            tabBar.frame = newFrame
        }
    

Ответ 5

Создайте собственный подкласс типа UITabBar, затем выполните следующий метод:

@implementation CustomTabBar
#define kTabBarHeight = // Input the height we want to set for Tabbar here
-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = kTabBarHeight;

    return sizeThatFits;
}
@end

Надеюсь, что это сработает.

Ответ 6

Протестировано в XCode 9.0 и Swift 4

Как было предложено в предыдущих ответах - наследовать UITabBar и переопределить sizeThatFits, но пометить height как @IBInspectable, чтобы его можно было установить в Конструкторе интерфейсов:

import UIKit

class CustomTabBar : UITabBar {
    @IBInspectable var height: CGFloat = 0.0

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var sizeThatFits = super.sizeThatFits(size)
        if height > 0.0 {
            sizeThatFits.height = height
        }
        return sizeThatFits
    }
}

Установите CustomTabBar класс для UITabBar в Identity Inspector (⌥⌘3):

Инспектор удостоверений панели табуляции

Затем установите желаемый height (больше, чем 0.0) в Attributes Inspector (⌥⌘4):

Инспектор атрибутов панели штриховок

Ответ 7

Для Swift 4

extension UITabBar {

     override open func sizeThatFits(_ size: CGSize) -> CGSize {
     var sizeThatFits = super.sizeThatFits(size)
     sizeThatFits.height = 60 // adjust your size here
     return sizeThatFits
    }
 }

Ответ 8

Swift 2.0:

var tabBar:UITabBar?

override func viewWillLayoutSubviews() {
    var tabFrame: CGRect = self.tabBar!.frame
    tabFrame.size.height = 60
    tabFrame.origin.y = self.view.frame.size.height - 60
    self.tabBar!.frame = tabFrame
}

Ответ 9

Swift 3.0 + Замените 200 на требуемую высоту в нижнем коде.

   extension UITabBar {
        override open func sizeThatFits(_ size: CGSize) -> CGSize {
            return CGSize(width: UIScreen.main.bounds.width, height: 200)
        }
    }

Ответ 10

Swift 4 & совместим с iphone x

class CustomTabBar : UITabBar {

@IBInspectable var height: CGFloat = 65.0

override open func sizeThatFits(_ size: CGSize) -> CGSize {
    guard let window = UIApplication.shared.keyWindow else {
        return super.sizeThatFits(size)
    }
    var sizeThatFits = super.sizeThatFits(size)
    if height > 0.0 {

        if #available(iOS 11.0, *) {
            sizeThatFits.height = height + window.safeAreaInsets.bottom
        } else {
            sizeThatFits.height = height
        }
    }
    return sizeThatFits
}
}

Ответ 11

Создание предыдущих ответов и обновление для Swift 3.

Подкласс UITabController и обязательно назначьте свой новый пользовательский класс инспектору идентификации вашего UITabController.

Swift 3.0

class MainTabBarController: UITabBarController {

    override func viewWillLayoutSubviews() {
        var newTabBarFrame = tabBar.frame

        let newTabBarHeight: CGFloat = 60
        newTabBarFrame.size.height = newTabBarHeight
        newTabBarFrame.origin.y = self.view.frame.size.height - newTabBarHeight

        tabBar.frame = newTabBarFrame
    }
}

Предупреждение: если вы получаете пустое место под панелью вкладок, убедитесь, что этот код был введен в viewWillLayoutSubviews(), а не viewDidLoad().

Ответ 12

Выполнение Xamarin:

public override void ViewWillLayoutSubviews()
{
    base.ViewWillLayoutSubviews();
    const float newTabBarHeight = 40f;
    TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - newTabBarHeight), TabBar.Frame.Width, newTabBarHeight);
}

Ответ 13

По какой-то причине ответ от @Rushikesh работал очень хорошо, пока iOS 10, но у меня были некоторые проблемы с iOS 11 и Swift 3.2. > .

TabBar менял свой кадр каждый раз, когда я касался новой вкладки.

Я исправил это, поместив код в функцию viewDidLayoutSubviews() вместо viewWillLayoutSubviews()

Swift 3:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    var tabFrame            = tabBar.frame
    tabFrame.size.height    = 65
    tabFrame.origin.y       = view.frame.size.height - 65
    tabBar.frame            = tabFrame
}

Ответ 14

Вы можете изменить высоту панели вкладок, разделив ее на подклассы. Я на самом деле сделал это давным-давно. xcode 6.0

override func sizeThatFits(_ size: CGSize) -> CGSize {
    return CGSize(width: super.sizeThatFits(size).width, height: 60)
}

Это должно вернуть его ширину по умолчанию с высотой 60 пунктов.

Ответ 15

это также один из способов сделать это

extension UITabBar {

override public func sizeThatFits(size: CGSize) -> CGSize {
    super.sizeThatFits(size)
    var sizeThatFits = super.sizeThatFits(size)
    sizeThatFits.height = 71
    return sizeThatFits
} }

Ответ 16

Работает со всеми размерами экрана: Установите для tabBarHeight значение (исходная высота tabBar - 20), это важно, чтобы вы могли использовать его позже в viewDidLayoutSubviews, также лучше, чем жесткое кодирование нужного размера. Так как этот размер может работать не на всех экранах.

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

var tabBarHeight = CGFloat()

override func viewDidLoad() {
        super.viewDidLoad()
        tabBarHeight = self.tabBar.frame.height - 20
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        var tabFrame = self.tabBar.frame
        guard let window = UIApplication.shared.keyWindow else {return}
        tabFrame.size.height = tabBarHeight + window.safeAreaInsets.bottom
        self.tabBar.frame = tabFrame
    }

Ответ 17

Отредактированный Киараш Асар отвечает с использованием Safe Area:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    var safeAreaBottomInset: CGFloat = 0.0

    if #available(iOS 11.0, *) {
        safeAreaBottomInset = view.safeAreaInsets.bottom
    }

    let newTabBarHeight: CGFloat = {{myDesiredHeight}} + safeAreaBottomInset

    var newFrame = tabBar.frame
    newFrame.size.height = newTabBarHeight
    newFrame.origin.y = view.frame.size.height - newTabBarHeight

    tabBar.frame = newFrame
}

Ответ 18

iPhoneX имеют разную высоту, поэтому, если мы переместимся на меньшую высоту, форма вкладки будет плохой в iPhoneX

- (void)viewWillLayoutSubviews
{
    int requiredHeight = 55;
    CGRect tabFrame = self.tabBar.frame;
    if (tabFrame.size.height < requiredHeight)
    {
        tabFrame.size.height = requiredHeight;
        tabFrame.origin.y = self.view.frame.size.height - requiredHeight;
        self.tabBar.frame = tabFrame;
    }
}