it-swarm.com.ru

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

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

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

Я использовал приведенный ниже код для изменения высоты UITabBar в одном из UIViewControllers (который находится внутри 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

50
Geek

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

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

const CGFloat kBarHeight = 80;

- (void)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;
}
122
Rushikesh

Для 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
}

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

39
MB_iOSDeveloper

Swift3.0, Swift 4.0 совместимый

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

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

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

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

    fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
    
  2. Отрегулируйте высоту 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
        }
    
32
Kiarash Asar

Создайте пользовательский подкласс типа 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

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

24
silentBeep

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

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

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):

 Tab Bar Identity Inspector

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

 Tab Bar Attributes Inspector

23
msrdjan

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
}
11
A.G

Опираясь на предыдущие ответы и обновления для 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 ().

6
Kqtr

Для 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
    }
 }
6
Ramazan Karami

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

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

Реализация 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);
}
4
Alexey Strakh

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

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

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

3
nferocious76

По некоторым причинам, ответ от @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
}
3
S. Azzopardi

РАБОТАЕТ С ВСЕМИ РАЗМЕРАМИ ЭКРАНА: Установите 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
    }
1
BrooklynCoder

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

extension UITabBar {

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

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;
    }
}
0
Abeer Iqbal

Отредактированные ответы Киараша Асара с использованием 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
}
0
jonaszmclaren

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
}
}
0
seggy