Позиционирование UITabBar наверху
Я начинаю разработку iOS. Мой вопрос: можно ли позиционировать UITabBar наверху и как?
Я не могу позиционировать мой UITabBar в верхней части представления.
Ответы
Ответ 1
Возможно ли это? Конечно, но это нарушает руководящие принципы интерфейса пользователя.
Скриншоты:
![Portrait]()
![Landscape]()
![Storyboard]()
код:
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, это противоречит руководящим принципам человеческого интерфейса.