Как создать меню физической кнопки меню (например, в Android) в iPhone?

Я разрабатываю приложение на основе навигации в iPhone.

В котором я хочу создать физическую кнопку меню, такую ​​​​как меню в телефонах Android.

Доступ к меню возможен из любого представления в иерархии.

Кто-нибудь знает, как мы можем этого добиться.

Можем ли мы добавить выдвижное меню в UINavigationBar?

Пожалуйста, не предлагайте tabbarcontroller, так как это последний вариант.


person harshalb    schedule 05.09.2011    source источник
comment
Как все, что нарисовано на экране, может быть физическим? Вы хотите что-то вроде раскрывающегося списка уведомлений Android?   -  person Filip Radelic    schedule 05.09.2011
comment
да что-то вроде того, что доступно по всей навигации   -  person harshalb    schedule 05.09.2011
comment
Вы видели iOS 5? Он делает что-то похожее, поэтому вы не сможете использовать этот жест для своего пользовательского интерфейса. Как насчет того, чтобы вы сказали нам, что именно вы хотите сделать в первую очередь, и мы подскажем, как это сделать?   -  person Filip Radelic    schedule 05.09.2011
comment
@fichek Вы видели лист действий, похожий на меню, которое появляется в Android при нажатии кнопки физического меню? Я хочу сделать что-то подобное ... пожалуйста, дайте мне какую-нибудь идею, которая поддерживает ios › 3.0, так как многие люди все еще используют iphone 3g или 3gs.   -  person harshalb    schedule 05.09.2011
comment
Я предполагаю, что UIActionSheet не соответствует вашим потребностям? Как вы хотите активировать этот лист? Используя кнопку на панели инструментов/навигационной панели?   -  person Filip Radelic    schedule 05.09.2011
comment
Я не хочу использовать uiactionsheet пользователя. Я просто хочу показать идею (вот так)   -  person harshalb    schedule 06.09.2011


Ответы (7)


Что вам нужно сделать, так это создать подкласс UIViewController, например. MasterViewController. Иметь все контроллеры представления подкласса MasterViewController. В MasterViewController вы можете написать код для создания и отображения представления вашего ящика, а затем все ваши контроллеры представления наследуют этот код и могут вызывать его для себя в любой момент.

Чтобы сдвинуть представление:

drawerView.frame = CGRectMake(0, -1*drawerView.frame.size.height, self.view.frame.size.width, whateverHeight);
[UIView beginAnimations:nil context:NULL];
drawerView.frame = CGRectMake(0, 0, self.view.frame.size.width, whateverHeight);
[UIView commitAnimations];

person Michael Frederick    schedule 13.09.2011
comment
Я думаю, что ваша идея также новаторская - person harshalb; 14.09.2011
comment
Это хорошее предложение, но, вероятно, не самое лучшее. Вы можете потерять данные о drawerView между загрузками представлений. - person aopsfan; 15.09.2011
comment
Я полагаю, вы можете переместить drawerView в синглтон и сохранить код для его отображения в MasterViewController. - person Michael Frederick; 15.09.2011
comment
Меня больше всего беспокоит действие ящика, а не данные на данный момент... Я хочу изменить текущую иерархию представлений из ящика. так что, вероятно, это лучший вариант для поддержки более старых версий ОС. вы должны поддерживать и это. - person harshalb; 16.09.2011

Я думаю, что вам нужно просто установить для titleView UINavigationItem произвольный UIView для обработки пользовательских нажатий.

Это не обязательно должна быть текстовая метка :)

person Sylvain G.    schedule 08.09.2011
comment
Я думаю, что могу объединить ваши ответы и ответы Мохаммеда, чтобы получить решение. Это как-то очень близко к тому, что я хочу. - person harshalb; 13.09.2011

Если это так, то я предлагаю вам взять sharedInstance с флагами, отслеживающими иерархию стека контроллера представления. Каждый раз, когда пользователь перемещается, просто обновляйте свой sharedInstance, выполняйте подготовку пользовательского меню и заполняйте его. Хорошей практикой было бы повторное использование вашего компонента пользовательского интерфейса, а не создание его нового при каждой операции навигации.

person Mohammad Abdurraafay    schedule 09.09.2011

Вы можете создать класс "DrawerView" и импортировать его туда, где вы захотите его использовать. Затем вы можете использовать presentModalViewController: myDrawer, чтобы он отображался, когда вам это нужно. Надеюсь, это имеет смысл.

person WrightsCS    schedule 05.09.2011
comment
эй, WrightCS, спасибо за ваше быстрое предложение. Но для вашей идеи я должен вызывать presentModalViewController в каждом контроллере в иерархии, вместо этого я хочу, чтобы ящик был встроен в uinavigationbar и мог вызывать, например, касаться uinavigationbar или тянуть с помощью дескриптора, такого как категория uinavigationbar. - person harshalb; 05.09.2011

Это очень просто..

В один XIB вы можете правильно добавить много просмотров. теперь добавьте два основных представления, например, представление данных и представление кнопок на нижней стороне, которые вы хотите использовать. (если вы не ошиблись с 4 кнопками для навигации), теперь оставьте это представление вверху. и всю другую иерархию представлений, которые вы можете добавить в это представление данных.

person Hardik Soni    schedule 15.09.2011

Я думаю, вам следует создать синглтон UIViewController или UIView для этого. Преимущество UIViewController в том, что его можно представить с помощью метода presentModalViewController:animated:, а также, если вам нужно, вы можете поместить его в свой стек навигации. Также преимуществом является наличие экземпляра UIView в то же время.
Используя шаблон singleton, вы можете получить доступ к своему классу в любом месте.

Проверьте эту ссылку из официальной документации о синглтоне в Objective-C: Создание экземпляра синглтона
Или вы можете использовать макрос Мэтта Галлахера (поскольку он очень удобен в использовании): макрос Singleton

person Infinite Possibilities    schedule 15.09.2011

Если вы можете получить бета-версию iOS 5, я настоятельно рекомендую это сделать. Новая бета-версия для разработчиков имеет расширение UIViewController, которое Apple называет контейнерными контроллерами представления. Их очень легко настроить, и я использую один из них в своем приложении.

Контроллеры представлений-контейнеров работают так же, как UINavigationControllers и UITabBarControllers, поскольку они позволяют добавлять контроллеры дочерних представлений, а не только дочерние представления. Как я уже сказал, они просты в настройке. Я объясню, как:

  1. Создайте новый класс с именем ContainerController. Добавьте метод инициализации с именем - (id)initWithNavigationController:(UINavigationController *)controller. Его реализация должна выглядеть примерно так:

    if ((self = [super init])) {
      [self addChildViewController:controller];
      controller.view.frame = CGRectMake(0, 0, 320, 420); // Leave room for the menu at bottom of the screen
      [self.view addSubview:controller.view];
    }
    

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

  2. В методе viewDidLoad ContainerController создайте меню:

    [super viewDidLoad];
    
    UIView *menuWrapperView = [[[UIView alloc] init] autorelease];
    menuWrapperView.frame = CGRectMake(0, 420, 320, 40); // Place a wrapper for the menu buttons directly below the navigation controller
    
    UIButton *button1 = ...;
    UIButton *button2 = ...;
    
    [menuWrapperView addSubview:button1];
    [menuWrapperView addSubview:button2];
    
    [self.view addSubview:menuWrapperView];
    

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

person aopsfan    schedule 15.09.2011
comment
что, если мне нужно поддерживать 3.1.3 в качестве цели развертывания - person harshalb; 16.09.2011
comment
Извините, но в этом случае это решение не сработает. Однако вы могли взломать весь код контроллера дочернего представления и просто добавить представления к ContainerController, но вы потеряли бы вызовы viewDidLoad, viewWillAppear и т. д. - person aopsfan; 17.09.2011
comment
На практике намеренно не использовать новые API, даже когда они нужны, вероятно, действительно плохая идея. - person aopsfan; 17.09.2011