UISegmentedControl, встроенный в UINavigationBar/Item

Я хотел бы встроить UISegmentedControl где-нибудь в верхнюю панель UINavigationControllers.

Нет проблем встроить его в UIBarButtonItem и установить как левый или правый элемент barButtonItem.

Я могу понять этот подход, когда имеешь дело с экранной недвижимостью iPhone. Однако я делаю это во всплывающем окне на iPad, и на верхней панели доступно «много» вертикального пространства. Если я добавляю segmentedControl как левый или правый barButtonItem, он уменьшается, так что я не могу видеть текст на моей кнопке сегмента, он становится шириной кнопки «Готово» и т. д. Если я попытаюсь добавить его в navigationItem TitleView, он будет отображаться полностью вправо и по-прежнему будет уменьшен больше, чем может отображать мой трехсегментный элемент управления с текстом.

Как мне добавить UISegmentedControl в центр UINavigationController, который обертывает содержимое всплывающих окон.

Надеюсь, кто-то может мне помочь:) спасибо заранее.


person RickiG    schedule 11.12.2010    source источник


Ответы (1)


Зачем вам нужно помещать элемент управления в строку заголовка всплывающего окна? У iPad гораздо больше места на экране, чтобы рассмотреть возможность размещения его на представлении ниже.

-- РЕДАКТИРОВАТЬ --

Я попробовал это сам, и это работает. Вот код настройки всплывающего контроллера:

- (IBAction) showPopover: (id) sender
{
    TestController *testController = [[TestController alloc] initWithStyle: UITableViewStylePlain];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: testController];
    UIPopoverController *controller = [[UIPopoverController alloc] initWithContentViewController: navController];
    [controller presentPopoverFromBarButtonItem: sender permittedArrowDirections: UIPopoverArrowDirectionAny animated: YES];
    controller.delegate = self;
    [testController release];
    [navController release];
}

Вот реализация TestController:

- (id) initWithStyle: (UITableViewStyle) style
{
    if ( (self = [super initWithStyle: style]) ) {
        UISegmentedControl *ctrl = [[UISegmentedControl alloc] initWithFrame: CGRectZero];
        ctrl.segmentedControlStyle = UISegmentedControlStyleBar;
        [ctrl insertSegmentWithTitle: @"One" atIndex: 0 animated: NO];
        [ctrl insertSegmentWithTitle: @"Two" atIndex: 0 animated: NO];
        [ctrl insertSegmentWithTitle: @"Three" atIndex: 0 animated: NO];
        [ctrl sizeToFit];
        // Any of the following produces the expected result:
        self.navigationItem.titleView = ctrl;
        //self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView: ctrl] autorelease];
        [ctrl release];
    }
    return self;
}

Вот результат:

alt textальтернативный текст

В моем коде нет никаких трюков, кроме отправки sizeToFit в сегментированный элемент управления. Это работает для вас?

person Costique    schedule 11.12.2010
comment
Привет, это контекстуально относится к панели, а не к содержанию. Так же, как это не имело бы смысла, если бы Apple поместила следующее сообщение со стрелкой вверх/вниз в почтовом приложении внутри выбранного электронного письма. Или если в список был помещен сегментированный контроллер для сортировки списка. - person RickiG; 11.12.2010
comment
Я понимаю. Я отредактировал свой ответ с рабочим кодом и снимками экрана. Надеюсь, это поможет. - person Costique; 11.12.2010
comment
Спасибо :) Это здорово, все дело в вызове sizeToFit. Еще раз спасибо. - person RickiG; 11.12.2010
comment
Теперь это сервис. Я просто надеюсь, что в следующий раз, когда я приду в SO за каким-то кодом, Costique обратит внимание и ответит таким кратким решением. Спасибо. - person Michael Morrison; 17.01.2011