web-dev-qa-db-ja.com

UITabBarの高さを変更する

ルートビューとして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の高さを変更して、次のようにするにはどうすればよいですか?

enter image description here

56
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;
}
127
Rushikesh

iOS 8.2Xcode 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
}

これは私のために働いた。

39
MB_iOSDeveloper

Swift3.0、Swift 4.0互換

Pre-iPhone Xデフォルトのタブバーの高さ:49pt

iPhone Xデフォルトのタブバーの高さ:83pt

iPhone X画面サイズを含むすべてのiOSデバイスをサポートするユニバーサルソリューションは次のようになります。

  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
        }
    
34
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

これがうまくいくことを願っています。

27
silentBeep

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)のCustomTabBarUITabBarクラスを設定します。

Tab Bar Identity Inspector

次に、Attributes Inspector(⌥⌘4)で目的のHeight0.0より大きい)を設定します。

Tab Bar Attributes Inspector

26
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

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
    }
 }
10
Ramazan Karami

以前の回答に基づいて、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()ではありません。

6
Kqtr

Swift 3.0 +以下のコードで200を希望する高さに置き換えます。

   extension UITabBar {
        override open func sizeThatFits(_ size: CGSize) -> CGSize {
            return CGSize(width: UIScreen.main.bounds.width, height: 200)
        }
    }
6
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);
}
5
Alexey Strakh

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

サブバー化することにより、タブバーの高さを変更できます。私は実際にずっと前にこれをやった。 xcode 6.0

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

これにより、デフォルトの幅が60ptsの高さで返されます。

4
nferocious76

これもその方法の1つです

extension UITabBar {

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

何らかの理由で、@ 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
}
4
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
    }
2
BrooklynCoder

セーフエリアを使用して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
}
1
jonaszmclaren

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