Ответ 1
Высота панели вкладок является постоянной, установленной Apple, поэтому вы не можете ее изменить.
Я использую 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
для достижения чего-то вроде этого:?
Высота панели вкладок является постоянной, установленной Apple, поэтому вы не можете ее изменить.
Я столкнулся с этой проблемой и смог ее решить.
Вы должны добавить следующий код в свой подкласс класса 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
}
Для 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
}
Это сработало для меня.
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
}
Создайте собственный подкласс типа 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
Надеюсь, что это сработает.
Протестировано в 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):
Для 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
}
}
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
}
Swift 3.0 + Замените 200 на требуемую высоту в нижнем коде.
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width, height: 200)
}
}
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
}
}
Создание предыдущих ответов и обновление для 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().
Выполнение 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);
}
По какой-то причине ответ от @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
}
Вы можете изменить высоту панели вкладок, разделив ее на подклассы. Я на самом деле сделал это давным-давно. xcode 6.0
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: super.sizeThatFits(size).width, height: 60)
}
Это должно вернуть его ширину по умолчанию с высотой 60 пунктов.
это также один из способов сделать это
extension UITabBar {
override public func sizeThatFits(size: CGSize) -> CGSize {
super.sizeThatFits(size)
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 71
return sizeThatFits
} }
Работает со всеми размерами экрана: Установите для 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
}
Отредактированный Киараш Асар отвечает с использованием 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
}
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;
}
}