ルートビューとしてUITabBarController
を使用し、アプリはiOS 6以降をサポートしています。プロジェクトクラスの階層は次のとおりです。
UITabBarController
- tab1
- UINavigationController
- UIViewController
- UIViewController
.
.
- tab2
- UINavigationController
- UIViewController
- UIViewController
.
.
.
- tab3
- UIViewController
- tab4
- UIViewController
上記の階層のUIViewControllers(UITabBar
内)の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
の高さを変更して、次のようにするにはどうすればよいですか?
私はこの問題に直面し、それを解決することができました。
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;
}
iOS 8.2、Xcode 6.2 Swift言語:
UITabBarController
(タイプUITabBarController
)の「DNMainTabVC.Swift」(DeveloperNameMainTabViewController.Swiftファイル)を作成し、ストーリーボード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
iPhone X画面サイズを含むすべてのiOSデバイスをサポートするユニバーサルソリューションは次のようになります。
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
}
}
Identity Inspector(⌥⌘3)のCustomTabBar
にUITabBar
クラスを設定します。
次に、Attributes Inspector(⌥⌘4)で目的のHeight
(0.0
より大きい)を設定します。
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
}
For 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の更新3。
UITabControllerをサブクラス化し、UITabControllerのIdentity Inspectorに必ず新しいカスタムクラスを割り当てます。
Swift 3.
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
}
}
Warning:タブバーの下に空白がある場合は、必ずこのコードをviewWillLayoutSubviews()に入れてください。 viewDidLoad()ではありません。
Swift 3.0 +以下のコードで200を希望する高さに置き換えます。
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width, height: 200)
}
}
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);
}
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
}
}
サブバー化することにより、タブバーの高さを変更できます。私は実際にずっと前にこれをやった。 xcode 6.0
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: super.sizeThatFits(size).width, height: 60)
}
これにより、デフォルトの幅が60ptsの高さで返されます。
これもその方法の1つです
extension UITabBar {
override public func sizeThatFits(size: CGSize) -> CGSize {
super.sizeThatFits(size)
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 71
return sizeThatFits
} }
何らかの理由で、@ Rushikeshからの回答はiOS 1までかなりうまく機能していましたが、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
}
すべての画面サイズで動作します: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
}
セーフエリアを使用してKiarash Asarの回答を編集しました。
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;
}
}