Добавление пользовательского представления над контроллером панели вкладок / контроллером навигации? - PullRequest
11 голосов
/ 25 июля 2011

Я попробовал следующий код, чтобы попытаться заставить пользовательское представление отображаться над контроллером панели вкладок (в котором во всех вкладках есть контроллер навигации).

Проблема в том, что она накладывается на верхнюю часть панели навигации, и я хочу, чтобы панель навигации была перемещена вниз.

Я попытался установить рамку контроллера панели вкладок, но это совсем не сдвинуло.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window
    //self.tabBarController.view.frame = CGRectMake(0, 62, 320, 320);
    self.window.rootViewController = self.tabBarController;

    [self.window makeKeyAndVisible];

    // setting up the header view
    self.headerView = [[HeaderView alloc] initWithFrame:CGRectMake(0, 20, 320, 42)];
    [self.window addSubview:self.headerView];

    // setting up facebook stuff
    AgentSingleton *agentSingleton = [AgentSingleton sharedSingleton];
    agentSingleton.facebook = [[Facebook alloc] initWithAppId:APP_ID];

    return YES;
}

Есть идеи?

Ответы [ 7 ]

28 голосов
/ 01 октября 2014

Добавить вид на вкладку BarController. Вид самого себя:

[self.tabBarController.view addSubview:yourView];
8 голосов
/ 09 января 2013

Вы можете просто добавить SubSview к окну:

[self.view.window addSubview:myView];
7 голосов
/ 01 августа 2011

Нет действительно хорошего способа сделать это. Различные подпредставления UINavigationController и UITabBarController являются частными, и попытка связываться с ними, вероятно, не будет работать правильно. И Apple не предоставляет нам инструменты для создания «контейнерных» контроллеров представления, поэтому вы не можете легко встроить UINavigationController / UITabBarController в другой контроллер представления или воссоздать UINavigationController / UITabBarController самостоятельно.

Ваша лучшая ставка, вероятно, состоит в том, чтобы пойти дальше и попытаться создать свой собственный «контейнерный» контроллер представления и справиться с некоторыми вещами, которые не работают должным образом. В частности, содержащийся контроллер вида parentViewController вернет ноль, и, следовательно, различные другие элементы в содержащем контроллере представления или его субконтроллерах будут повреждены (например, свойство interfaceOrientation будет неправильным, presentModalViewController:animated: может работать неправильно ). Другие вещи тоже могут быть сломаны.

Или вы могли бы подождать, пока какая-нибудь будущая версия iOS действительно поддержит нас в создании контроллеров представления контейнера (если вообще когда-либо), а затем будет поддерживать только эту версию и выше.

2 голосов
/ 20 января 2018

Вы можете сделать что-то подобное:

if let indeedTabBarController = self.tabBarController {

    let buttonHeight: CGFloat = 49 // height of tab bar
    let buttonWidth = UIScreen.main.bounds.width / 3 // in case if you have 3 tabs
    let frame = CGRect(x: 0, y: UIScreen.main.bounds.height - buttonHeight, width: buttonWidth, height: buttonHeight)
    let button = UIButton(frame: frame)
    button.addTarget(self, action: #selector(self.someAction), for: .touchUpInside)

    indeedTabBarController.view.addSubview(button)
}
0 голосов
/ 27 февраля 2019

У меня была такая же проблема, и в итоге я сделал что-то вроде этого:

self.newView.frame = self.tabBarController.tabBar.frame
self.tabBarController.view.addSubview(self.newView)

Добавление представления к tabBarController и использование рамки текущей вкладки в качестве позиции нового представления сделали свое дело.

0 голосов
/ 28 января 2014

Я не могу комментировать, поэтому я напишу это здесь для всех, кто сталкивается с этой страницей.Ответ Борута, за который проголосовали, был на самом деле более простым и правильным.

Он просто не дал вам правильных указаний.Вам нужно добавить пользовательское представление в окно для вашего приложения, которое объявлено в вашем AppDelegate (в Mono это будет AppDelegate.Window.Add (myView), , а не в текущем окне представления, которое равно нулю (например this.View.Window).

Это прекрасно работает в Xamarin / Mono, и я не могу понять, почему в Obj-C в правильном коде все будет не так.

0 голосов
/ 26 июля 2011

Вы имеете в виду выше как вертикально над остальным содержимым?

Или выше, как сидя на вершине остального содержимого?

Там присутствует ModalViewController: animated: но я сомневаюсь, что вы этого хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...