2013-09-23 2 views
21

В настоящее время я пытаюсь установить следующие/предыдущие кнопки на панели инструментов клавиатуры на новые, гладкие кнопки кнопки/кнопки назад iOS 7, которые возвращаются в навигационные контроллеры. Вот что я пытаюсь. Как я могу использовать элемент кнопки панели управления вместо скучного статического текста?Следующая панель инструментов клавиатуры iOS7

[self setToolbar:[[UIToolbar alloc] initWithFrame:self.frame]]; 
     [self.toolbar setBarStyle:UIBarStyleDefault]; 
     [self.toolbar setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth)]; 
     [self addSubview:self.toolbar]; 

     [self setSegmentedControl:[[UISegmentedControl alloc] initWithItems:@[ NSLocalizedStringFromTable(@"Previous", @"BSKeyboardControls", @"Previous button title."), 
                       NSLocalizedStringFromTable(@"Next", @"BSKeyboardControls", @"Next button title.") ]]]; 

Вот что он выглядит сейчас:

enter image description here

Вот что я хочу, чтобы это выглядело как: enter image description here

Любые идеи о том, как получить доступ к этим элементы системы без на самом деле использует изображения? Я знаю его точный элемент кнопки панели управления iOS 7, я просто не знаю, как получить доступ к нему в панели инструментов. Я искал везде. Если это помогает, я использую BSKeyboardControls.

EDIT: чтобы он выглядел точно так же, как на втором изображении, используйте изображения, предоставленные Джошуа, и сохраните их как [email protected] и [email protected] в свой проект xcode. Используйте код Чун, но не забудьте вызвать метод для получения таких изображений: imageNamed: @ "back", а не @ "back @ 2x". Теперь у вас есть IOS 7 назад и вперед кнопки :)

edit2: Для того, чтобы заставить его выглядеть так же, как следующий/предыдущий кнопки со стрелками используются следующие настройки в правильных методах реализации:

[self.segmentedControl setWidth:50 forSegmentAtIndex:0]; 
[self.segmentedControl setWidth:38 forSegmentAtIndex:1]; 

negativeSeparator.width = -19; 

EDIT3: панель инструментов с <> стрелки появляются по умолчанию со всеми UIWebViews и появляются, когда вы нажимаете текстовое поле.

Если вас интересует образец проекта, дайте мне знать, и я загружу ссылку!

EDIT4: По состоянию на 24 мая 2014 года BSKeyboardControls теперь имеет эту функциональность по умолчанию.

ответ

6

1) Скачать последние файлы: https://github.com/simonbs/BSKeyboardControls

2) Импорт изображений для следующих кнопок назад /. Они могут быть любыми, что вы хотите, и вы можете установить соответствующие размеры, чтобы они выглядели хорошо. У Джошуа хороший набор. Я сохранил свою память как «keyboardBack.png» и «keyboardForward.png»

3) В BSKeyboardControls.m обновите поля initWithFields:. Здесь вы можете выполнить некоторую настройку, например, установить ширину ваших задних/следующих кнопок. Я также удалил кнопку «Готово», чтобы следить за снимками экрана, но вы можете добавить их обратно.

- (id)initWithFields:(NSArray *)fields 
{ 
    if (self = [super initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)]) 
    { 
     // Creates toolbar 
     [self setToolbar:[[UIToolbar alloc] initWithFrame:self.frame]]; 
     [self.toolbar setBarStyle:UIBarStyleDefault]; 
     [self.toolbar setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth)]; 
     [self addSubview:self.toolbar]; 

     // Import images 
     UIImage *backImage = [[UIImage imageNamed:@"keyboardBack"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
     UIImage *forwardImage = [[UIImage imageNamed:@"keyboardForward"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 

     // Create segmentedcontrol 
     self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[backImage, forwardImage]]; 
     self.segmentedControl.tintColor = [UIColor clearColor]; 

     // Set button widths 
     [self.segmentedControl setWidth:50 forSegmentAtIndex:0]; 
     [self.segmentedControl setWidth:50 forSegmentAtIndex:1]; 

     // Other BSKeyboardControls stuff 
     [self.segmentedControl addTarget:self action:@selector(segmentedControlValueChanged:) forControlEvents:UIControlEventValueChanged]; 
     [self.segmentedControl setMomentary:YES]; 
     [self.segmentedControl setEnabled:NO forSegmentAtIndex:BSKeyboardControlsDirectionPrevious]; 
     [self.segmentedControl setEnabled:NO forSegmentAtIndex:BSKeyboardControlsDirectionNext]; 
     [self setSegmentedControlItem:[[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl]]; 
     [self setVisibleControls:(BSKeyboardControlPreviousNext)]; 
     [self setFields:fields]; 
    } 

    return self; 
} 

4) Левая обивка на панели инструментов немного слишком много, так что вы можете это исправить, добавив отрицательный разделитель в toolbarItems: в BSKeyboardControls.m:

- (NSArray *)toolbarItems 
{ 
    NSMutableArray *items = [NSMutableArray arrayWithCapacity:3]; 
    if (self.visibleControls & BSKeyboardControlPreviousNext) 
    { 
     UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
                          target:nil 
                          action:nil]; 
     negativeSeperator.width = -12; 

     [items addObject:negativeSeperator]; 
     [items addObject:self.segmentedControlItem]; 

    } 

    if (self.visibleControls & BSKeyboardControlDone) 
    { 
     [items addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]]; 
     [items addObject:self.doneButton]; 
    } 

    return items; 
} 

Примечание: Я, наверное, не имеют ширины кнопок и прокладки к точным спецификациям, но вы можете настроить ее по своему вкусу!

+0

Замечательный, углубленный ответ! Отличная работа! Если бы вы ответили немного раньше, я бы тоже дал вам щедрость! –

0

Используйте это: https://github.com/simonbs/BSKeyboardControls

Но он использует сегментированный контроль, который получил сплющенный в прошивке 7.

Edit: Просто измените текст сегментов:

[self setSegmentedControl:[[UISegmentedControl alloc] initWithItems:@[@"<",@">") ]]]; 

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

+0

Это то, что я использую. Мне просто интересно, как изменить сегментированный контроль только на символы <>. –

+0

Вы имеете в виду, просто измените текст на источник кода BSKeyboard: –

+2

Нет, я имею в виду фактически использовать стрелки iOS 7. Как и на навигационных элементах. –

20

Это изображения, используемые на панели инструментов, например. задние и кнопки вперед изображения:

enter image description here

enter image description here

+0

Я предполагаю, что это x2? У вас есть x1? –

+1

@Arian Я боюсь, что нет, вы должны просто уметь сокращать их наполовину, чтобы дать еще неплохое 1x изображение. – Joshua

+3

Там, где вы можете найти иконки: http://icons8.com/icons/#!/3299/next – Armanoide

8

Используйте значки разделяемые Навина, а затем попробуйте ниже фрагмент кода, и вы будете хорошо идти. Я не добавил здесь кнопку done.

UIImage *backImage = [[UIImage imageNamed:@"backImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
UIImage *forwardImage = [[UIImage imageNamed:@"forward"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[backImage, forwardImage]]; 
[self.segmentedControl addTarget:self action:@selector(segmentedControlChangedState:) forControlEvents:UIControlEventValueChanged]; 
self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
self.segmentedControl.tintColor = [UIColor clearColor]; 
UIBarButtonItem *aSegmentedControlBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl]; 
[self setItems:@[aSegmentedControlBarButtonItem, self.flexibleSpace]]; 
+0

Что такое тип параметра 'segmentedControlChangedState:'? 'UISegmentedControl'? – devios1

+1

Да.'- (void) segmentedControlChangedState: (UISegmentedControl *) iSender' – Abhinav

+0

' segmentedControlStyle' устарел, теперь он не действует. – Joey

2

Вы можете использовать этот большой tool по @iftekhar и настроить IQSegmentedNextPrevious в соответствии с вашими потребностями для придания изображения вместо следующей предыдущей кнопки.

+2

Согласен. Я просто попробовал эту библиотеку, и это потрясающе. –

5

Если вы не против жить на краю, вы можете использовать недокументированные системные элементы Apple, чтобы получить вид iOS 7. Здесь находятся элементы левой и правой кнопки.

[self setDoneButton:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:nil action:nil]]; 
    [self setDoneButton:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:nil action:nil]]; 

Источник: http://iphonedevwiki.net/index.php/UIBarButtonItem

+0

Разрешено ли для приложений App Store? –

+0

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

+0

Как это сделать с помощью Swift? – Steffen

0

Использование Xcode 7.3, вы также можете просто ввести символ в качестве заголовка для элемента панели. Это работает как в коде и в Interface Builder:

  • Поместите курсор туда, куда вы хотите, чтобы появиться символ (например, title окна в IB или в кавычках в коде).
  • В меню Xcode нажмите «Редактировать», затем «Emoji» & Символы. (В качестве альтернативы нажмите клавишу «Command-Command-space», чтобы открыть список символов.)
  • В поле поиска введите less или more.
  • Затем выберите нужный символ.

Символы меньшего размера и больше по умолчанию по умолчанию имеют синий цвет на панели инструментов.

В коде:

backButton.title = "<" 

В IB:

control-command-click to bring up Emoji & Symbols

Смежные вопросы