web-dev-qa-db-ja.com

UITabBarを上部に配置する

私はiOS開発の初心者です。私の質問は、UITabBarを最上部に配置することは可能ですか? UITabBarをビューの上部に配置できません。

24
AlgroDev

出来ますか?確かに、しかしそれはヒューマンインターフェースのガイドラインに違反しています。

スクリーンショット:

PortraitLandscapeStoryboard

コード:

TabController.h:

#import <UIKit/UIKit.h>

@interface TabController : UITabBarController <UITabBarControllerDelegate>

@end

TabController.m:

#import "TabController.h"

@interface TabController ()

@end

@implementation TabController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    [self.tabBar invalidateIntrinsicContentSize];

    CGFloat tabSize = 44.0;

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

    if (UIInterfaceOrientationIsLandscape(orientation))
    {
        tabSize = 32.0;
    }

    CGRect tabFrame = self.tabBar.frame;

    tabFrame.size.height = tabSize;

    tabFrame.Origin.y = self.view.frame.Origin.y;

    self.tabBar.frame = tabFrame;

    // Set the translucent property to NO then back to YES to
    // force the UITabBar to reblur, otherwise part of the
    // new frame will be completely transparent if we rotate
    // from a landscape orientation to a portrait orientation.

    self.tabBar.translucent = NO;
    self.tabBar.translucent = YES;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end
35
klcjr89

Swift3:UITabBarControllerのカスタムクラスを作成することでこれを実現します。

class CustomTabBarController: UITabBarController {

   @IBOutlet weak var financialTabBar: UITabBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        // I've added this line to viewDidLoad
        UIApplication.shared.statusBarFrame.size.height
        financialTabBar.frame = CGRect(x: 0, y:  financialTabBar.frame.size.height, width: financialTabBar.frame.size.width, height: financialTabBar.frame.size.height)
    }

カスタムクラスをTabBarControllerに設定することを忘れないでください enter image description here

結果は次のようになります。

enter image description here

8
Milad Faridnia

以下はaviatorken89のコードのSwift 3の例です。

  1. 最初に新しいファイルを作成します。
  2. ソースココアタッチクラスを選択します。
  3. サブクラスの指定:UITabBarController
  4. クラスに「CustomTabBarController」などの名前を付けます。
  5. 次のコードをクラスに追加します。

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        var tabFrame:CGRect = self.tabBar.frame
        tabFrame.Origin.y = self.view.frame.Origin.y
        self.tabBar.frame = tabFrame
    }
    
  6. ストーリーボードを使用している場合は、「IDインスペクター」を使用して、タブバークラスをカスタムクラスに変更してください。

7
Leo
override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
}

storyboardenter image description here

UPDATE IOS 11 ISSUE

上記のコードはiOS 11では動作しません。そのため、ここで回避策を見つけました。

override func viewDidLayoutSubviews() {
    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)

    super.viewDidLayoutSubviews()
}
3
mnemonic23

tabbarControllerのサブビューはTabbarの後ろに隠れます。修正するには、このコードを使用します:

class CustomTabBarController: UITabBarController ,UITabBarControllerDelegate{

    override func viewDidLayoutSubviews() {
        tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
        super.viewDidLayoutSubviews()
        delegate = self
        selectedViewController?.view.frame.Origin = CGPoint(x: 0, y: tabBar.frame.size.height)
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
          selectedViewController?.view.frame.Origin = CGPoint(x: 0, y: tabBar.frame.size.height)
    }

}
3
hamed hosiny

カスタムタブバーを自分で作成して作成することもできますが、Appleは本来意図されていなかった機能のシステムコントロールを模倣することを強く推奨します。

繰り返しますが、アプリとシステムアプリの一貫性に違反するため、そうすることはお勧めしません。しかし、私はそこにいるので、ここに行きます:

カスタムタブバーの場合、複数のボタンを保持するビューを作成する必要があります。コンテナビューも必要です the UITabBarUITabBarを一番上にしたいため)。ボタンを押すと、コンテナ内のUIViewControllerを変更します。
それは非常に単純ですが、もちろん、強くお勧めしません。

1
Schemetrical