Ich verwende UITabBarController
als Root-Ansicht und App unterstützt iOS 6 und höher. Die Projektklassenhierarchie ist wie folgt.
UITabBarController
- tab1
- UINavigationController
- UIViewController
- UIViewController
.
.
- tab2
- UINavigationController
- UIViewController
- UIViewController
.
.
.
- tab3
- UIViewController
- tab4
- UIViewController
Ich habe den folgenden Code verwendet, um die Höhe UITabBar
eines der UIViewController (der sich darin befindet UINavigationController
) in der obigen Hierarchie zu ändern .
CGRect tabbarFrame = self.tabBarController.tabBar.frame;
tabbarFrame.size.height += 60;
self.tabBarController.tabBar.frame = tabbarFrame;
Aber es ändert nicht die Höhe. UITabBar
wird mit der Standardhöhe angezeigt. Durch die Protokollierung wird der geänderte Wert wie unten gezeigt gedruckt.
<UITabBar: 0xb528f60; frame = (0 431; 320 109); autoresize = W+TM; layer = <CALayer: 0xb529080>>
Wie kann ich die UITabBar
Größe ändern , um so etwas zu erreichen?
Antworten:
Ich war mit diesem Problem konfrontiert und konnte es lösen.
Sie müssen Ihrer
UITabBarController
Klassenunterklasse folgenden Code hinzufügen .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; }
Schnell:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() tabBar.frame.size.height = kBarHeight tabBar.frame.origin.y = view.frame.height - kBarHeight }
quelle
viewWillLayoutSubviews
Implementierung sollte super aufrufen, wahrscheinlich als erste Zeile.super
, aber es muss nicht:The default implementation of this method does nothing.
(aus den Dokumenten)UIViewController
aber möglicherweise nicht wahr fürUITabBarController
viewWillLayoutSubviews
zuviewDidLayoutSubviews
iOS 13.Für iOS 8.2 , Xcode 6.2 Schnelle Sprache:
Erstellen Sie eine "DNMainTabVC.swift" -Datei (DeveloperNameMainTabViewController.swift) für Ihre
UITabBarController
(vom TypUITabBarController
) und verbinden Sie sie mit Ihrer Storyboard-VC.Fügen Sie die folgenden Zeilen hinzu:
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 }
Das hat bei mir funktioniert.
quelle
Getestet in XCode 9.0 und Swift 4
Wie in den vorherigen Antworten vorgeschlagen - erben
UITabBar
und überschreibensizeThatFits
, aberheight
als markieren@IBInspectable
, damit es im Interface Builder festgelegt werden kann :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 } }
Set -
CustomTabBar
Klasse für denUITabBar
in dem Identity - Inspector (⌥⌘3):Stellen Sie dann im Attributinspektor (⌥⌘4) den gewünschten Wert
Height
(größer als ) ein:0.0
quelle
@IBInspectable var height
in der Erweiterung angeben. Wenn dies möglich ist, kann der zweite Schritt der Angabe der benutzerdefinierten Klasse vermieden werden.Swift3.0, Swift 4.0 kompatibel
Standardhöhe der Registerkartenleiste vor dem iPhone X : 49pt
Standardhöhe der iPhone X- Registerkartenleiste: 83pt
Eine universelle Lösung, die jedes iOS-Gerät einschließlich der iPhone X- Bildschirmgröße unterstützt, würde folgendermaßen aussehen:
Erfassen Sie die Standardhöhe von UITabBar:
Passen Sie die Höhe der UITabBar an:
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 }
quelle
Erstellen Sie eine benutzerdefinierte Unterklasse vom Typ
UITabBar
und implementieren Sie die folgende Methode:@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
Hoffe das wird funktionieren.
quelle
Für 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 } }
quelle
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 }
quelle
Swift 3.0+ Ersetzen Sie 200 im folgenden Code auf die gewünschte Höhe.
extension UITabBar { override open func sizeThatFits(_ size: CGSize) -> CGSize { return CGSize(width: UIScreen.main.bounds.width, height: 200) } }
quelle
sizeThatFits()
Ansatz verwenden möchten, verwenden Sie stattdessen diese Lösung: stackoverflow.com/a/46425620/538491Swift 4 & kompatibel mit 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 } }
quelle
extension
, da ich alle UI-Elemente programmgesteuert erstelle und beim Versuch, dietabBar
von mytabBarController
durch Überschreiben destabBar
Attributs festzulegen, eine leere tabBar (ohne Elemente)Aufbauend auf früheren Antworten und Aktualisierung für Swift 3.
Unterklasse UITabController und stellen Sie sicher, dass Sie Ihre neue benutzerdefinierte Klasse dem Identitätsinspektor Ihres UITabControllers zuweisen.
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 } }
Warnung : Wenn unter Ihrer Registerkartenleiste ein Leerzeichen angezeigt wird, stellen Sie sicher, dass Sie diesen Code in viewWillLayoutSubviews () und nicht in viewDidLoad () eingefügt haben.
quelle
NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutAttribute.equal, toItem: view, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0)
Ich habe gefundensafeAreaInsets
undsafeAreaLayoutGuide
aber die Funktion ist nur für iOS 11 und höher verfügbar. Beziehen Sie sich darauf?Aus irgendeinem Grund funktionierte die Antwort von @Rushikesh bis iOS 10 ziemlich gut, aber ich hatte einige Probleme mit iOS 11 und Swift 3.2 .
Die Registerkartenleiste änderte ihren Rahmen jedes Mal, wenn ich eine neue Registerkarte berührte.
Ich habe dies behoben, indem ich den Code in die
viewDidLayoutSubviews()
Funktion anstatt eingefügt habeviewWillLayoutSubviews()
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 }
quelle
Xamarin-Implementierung:
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); }
quelle
Die Antworten von Kiarash Asar wurden unter Verwendung des sicheren Bereichs bearbeitet:
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 }
quelle
Sie können die Höhe der Registerkartenleiste ändern, indem Sie sie in Unterklassen unterteilen. Das habe ich eigentlich schon vor langer Zeit gemacht. xcode 6.0
override func sizeThatFits(_ size: CGSize) -> CGSize { return CGSize(width: super.sizeThatFits(size).width, height: 60) }
Das sollte seine Standardbreite mit der Höhe von 60 Punkten zurückgeben.
quelle
Dies ist auch eine Möglichkeit, dies zu tun
extension UITabBar { override public func sizeThatFits(size: CGSize) -> CGSize { super.sizeThatFits(size) var sizeThatFits = super.sizeThatFits(size) sizeThatFits.height = 71 // or whatever height you need return sizeThatFits } }
quelle
ARBEITET MIT ALLEN BILDSCHIRMGRÖSSEN: Stellen Sie die tabBarHeight auf die (ursprüngliche Höhe der tabBar - 20) ein. Dies ist wichtig, damit Sie sie später in den viewDidLayoutSubviews verwenden können, auch besser als die gewünschte Größe hart zu codieren. Da diese Größe möglicherweise nicht auf allen Bildschirmen funktioniert.
Fenstersichere Bereichseinsätze halten die erforderliche Polsterung am unteren Rand der Registerkarte-Leiste aufrecht, um den Abstand vom unteren Rand des Bildschirms einzuhalten.
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 }
quelle
iPhoneX haben unterschiedliche Höhen. Wenn wir also auf eine kleinere Höhe wechseln, ist die Form der Registerkarten in iPhoneX schlecht
- (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; } }
quelle
Swift 5.3.1, XCode 11+, iOS 14:
import UIKit class CustomTabBar: UITabBar { let height: CGFloat = 62 override open func sizeThatFits(_ size: CGSize) -> CGSize { guard let window = UIApplication.shared.connectedScenes .filter({$0.activationState == .foregroundActive}) .map({$0 as? UIWindowScene}) .compactMap({$0}) .first?.windows .filter({$0.isKeyWindow}).first else { return super.sizeThatFits(size) } var sizeThatFits = super.sizeThatFits(size) if #available(iOS 11.0, *) { sizeThatFits.height = height + window.safeAreaInsets.bottom } else { sizeThatFits.height = height } return sizeThatFits } }
quelle
Klasse TabBarVC: UITabBarController {
//MARK:- Variable let HEIGHT_TAB_BAR:CGFloat = 500 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() var tabFrame = self.tabBar.frame tabFrame.size.height = HEIGHT_TAB_BAR tabFrame.origin.y = self.view.frame.size.height - HEIGHT_TAB_BAR self.tabBar.frame = tabFrame }
}}
Hat gut für mich funktioniert.
quelle