Позиционирование UITabBar наверху

Я начинаю разработку iOS. Мой вопрос: можно ли позиционировать UITabBar наверху и как? Я не могу позиционировать мой UITabBar в верхней части представления.

Ответы

Ответ 1

Возможно ли это? Конечно, но это нарушает руководящие принципы интерфейса пользователя.

Скриншоты:

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

Ответ 2

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 введите описание изображения здесь

Результат будет таким:

введите описание изображения здесь

Ответ 3

Вот рабочий пример 3 сценария aviatorken89.

  • Сначала создайте новый файл.
  • Выберите исходный класс cocoa touch.
  • Определить подкласс: UITabBarController
  • Назовите класс "CustomTabBarController" или что хотите.
  • Добавьте в класс следующий код.

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        var tabFrame:CGRect = self.tabBar.frame
        tabFrame.origin.y = self.view.frame.origin.y
        self.tabBar.frame = tabFrame
    }
    
  • Если вы используете раскадровку, обязательно измените класс панели вкладок на свой собственный класс с помощью "Инспектора идентификации".

Ответ 4

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

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

раскадровка введите описание изображения здесь

ОБНОВЛЕНИЕ 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()
}

Ответ 5

Вы можете создать собственную панель вкладок, сделав ее самостоятельно, но яблоко сильно обескураживает имитацию системного элемента управления для функции, изначально не предназначенной для нее.

Еще раз, я препятствую вам сделать это, потому что это нарушает последовательность ваших приложений и системных приложений. Но так как я нахожусь здесь, мы идем:

Для пользовательской панели вкладок вам необходимо создать представление, содержащее несколько кнопок. Вам также нужен вид контейнера ниже UITabBar (потому что вы хотите, чтобы UITabBar был наверху). При нажатии кнопки вы меняете UIViewController внутри контейнера.
Это довольно просто, но, конечно, его настоятельно не рекомендуется.

Ответ 6

подпредставления 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)
    }

}

Ответ 7

Если вы хотите что-то вроде UITabBar сверху, то как насчет создания пользовательского UIView и добавления в него количества UIButtons. Затем свяжите некоторые ViewControllers с каждой кнопкой через Segue. Готово!

Вам не нужно настраивать UITabBar. Как ранее сообщал aviatorken89, это противоречит руководящим принципам человеческого интерфейса.