私はiOS開発の初心者です。私の質問は、UITabBarを最上部に配置することは可能ですか? UITabBarをビューの上部に配置できません。
出来ますか?確かに、しかしそれはヒューマンインターフェースのガイドラインに違反しています。
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
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
に設定することを忘れないでください
結果は次のようになります。
以下はaviatorken89のコードのSwift 3の例です。
次のコードをクラスに追加します。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
var tabFrame:CGRect = self.tabBar.frame
tabFrame.Origin.y = self.view.frame.Origin.y
self.tabBar.frame = tabFrame
}
ストーリーボードを使用している場合は、「IDインスペクター」を使用して、タブバークラスをカスタムクラスに変更してください。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
}
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()
}
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)
}
}
カスタムタブバーを自分で作成して作成することもできますが、Appleは本来意図されていなかった機能のシステムコントロールを模倣することを強く推奨します。
繰り返しますが、アプリとシステムアプリの一貫性に違反するため、そうすることはお勧めしません。しかし、私はそこにいるので、ここに行きます:
カスタムタブバーの場合、複数のボタンを保持するビューを作成する必要があります。コンテナビューも必要です下 the UITabBar
(UITabBar
を一番上にしたいため)。ボタンを押すと、コンテナ内のUIViewController
を変更します。
それは非常に単純ですが、もちろん、強くお勧めしません。