Стиль UIButton при добавлении в navigationItem.titleView - PullRequest
3 голосов
/ 15 февраля 2012

Мне нужно добавить кнопку к UINavigationItem titleView (фактически к центру панели UINavigation.

Для этого я использовал следующий код:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 70, 30);
[btn setSelected:YES];
[btn setTitle:@"list" forState:UIControlStateNormal];

И я иду следующее:

enter image description here

Мне нужно присвоить кнопке «список» тот же стиль кнопки «Готово» (то есть UIBarButtonItem)?

Ответы [ 4 ]

7 голосов
/ 23 ноября 2012

Вы можете использовать UISegmentedControl:

UISegmentedControl *mySegmentedControl = [[UISegmentedControl alloc]
                initWithItems:@"Example"]];
mySegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
[mySegmentedControl addTarget:self action:@selector(myMethod)
       forControlEvents:UIControlEventValueChanged];

self.navigationItem.titleView = mySegmentedControl;
1 голос
/ 28 мая 2013

Я использовал подход Андрея на основе UISegmentedControl и немного его расширил, чтобы вести себя как обычный UIButton:

@interface SPWKBarButton : UISegmentedControl
- (id)initWithTitle:(NSString *)title;
- (void)setTitle:(NSString *)title;
@end

@implementation SPWKBarButton 

- (id)initWithTitle:(NSString *)title
{
    self = [super initWithItems:@[title]];

    if (self) {
        self.segmentedControlStyle = UISegmentedControlStyleBar;

        NSDictionary *attributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor]
                                                               forKey:UITextAttributeTextColor];

        [self setTitleTextAttributes:attributes
                            forState:UIControlStateNormal];
    }

    return self;
}

- (void)setTitle:(NSString *)title
{
    [self setTitle:title forSegmentAtIndex:0];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
        self.selectedSegmentIndex = 0;
    } else {
        self.selectedSegmentIndex = UISegmentedControlNoSegment;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

    if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
        [self sendActionsForControlEvents:UIControlEventTouchUpInside];
    }

    self.selectedSegmentIndex = UISegmentedControlNoSegment;
}

@end

Для базового использования вы можете использовать его в качестве замены выпадающего UIButton:

_button = [[SPWKBarButton alloc] initWithTitle:titles[0]];

[_button addTarget:self
            action:@selector(doSomething:)
  forControlEvents:UIControlEventTouchUpInside];

[self.navigationItem setTitleView:_button];

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

1 голос
/ 15 февраля 2012

UIBarButtonItems можно использовать только как элементы в UIToolbar (на самом деле они не являются экземплярами UIView), поэтому единственный способ напрямую использовать UIBarButtonItem в вашем titleView - это установить экземпляр UIToolbar в качестве вашего titleView и добавить ваш barButtonItem для этой панели инструментов. Однако я не думаю, что это сработает.

Я думаю, что вам нужно найти способ имитировать стиль UIBarButtonItem, используя простой старый UIButton. Вы можете получить фактический файл изображения, используемый для создания UIBarButtonItems, используя UIKit artwork extractor . Тогда это просто вопрос создания пользовательской кнопки UIB с использованием этого фонового изображения, и все готово.

0 голосов
/ 15 февраля 2012

Да, вам также следует использовать UIBarButtonItem для кнопки «список»

с использованием пользовательского идентификатора и свойств заголовка.

Вы можете использовать идентификатор UIBarButtonItem «гибкое пространство» для отображения вашей кнопки «список» в центре.

...