Helpers - компьютеры, интернет, программирование

Следующая/предыдущая панель инструментов клавиатуры iOS7

В настоящее время я пытаюсь установить для кнопок «Далее»/«Предыдущий» на панели инструментов моей клавиатуры новые, гладкие кнопки «Назад»/«Вперед» в iOS 7, которые помещаются в навигационные контроллеры, чтобы вернуться назад. Вот что я пытаюсь. Как я могу использовать элемент кнопки системной панели вместо скучного статического текста?

[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.") ]]];

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

введите здесь описание изображения

Вот как я хочу, чтобы это выглядело: введите здесь описание изображения

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

РЕДАКТИРОВАТЬ: Чтобы он выглядел точно так же, как второе изображение, используйте изображения, предоставленные Джошуа, и сохраните их как [email protected] и [email protected] в свой проект xcode. Используйте код Чуна, но не забудьте вызвать метод для получения изображений следующим образом: imageNamed:@"back", а не @"back@2x". Теперь у вас есть кнопки «назад» и «вперед» в iOS 7 :)

РЕДАКТИРОВАТЬ 2: чтобы он выглядел точно так же, как кнопки со стрелками "следующий/предыдущий", используйте следующие настройки в правильных методах реализации:

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

negativeSeparator.width = -19;

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

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

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


Ответы:


1

1) Загрузите последние файлы с: https://github.com/simonbs/BSKeyboardControls.

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

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

- (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;
}

Примечание. У меня, вероятно, нет точной ширины кнопок и отступов, но вы можете настроить их по своему вкусу!

14.12.2013
  • Замечательный, подробный ответ! Прекрасная работа! Если бы вы ответили немного раньше, я бы тоже дал вам награду! 15.12.2013

  • 2

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

    введите здесь описание изображения

    введите здесь описание изображения

    03.11.2013
  • Я так понимаю это х2? У тебя тоже х1? 13.05.2014
  • @Arian Боюсь, что нет, вы должны просто уменьшить их наполовину, чтобы получить довольно хорошее изображение 1x. 13.05.2014

  • 3

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

    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]];
    
    03.11.2013
  • Какой тип параметра у segmentedControlChangedState:? UISegmentedControl? 06.11.2014
  • да. - (void)segmentedControlChangedState:(UISegmentedControl *)iSender 06.11.2014
  • segmentedControlStyle устарел, теперь не действует. 27.04.2015

  • 4

    Если вы не против жить на грани, вы можете использовать недокументированные системные элементы 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.

    07.01.2014
  • Разрешено ли это для приложений App Store? 05.04.2014
  • Правильный ответ таков, поскольку Apple по-своему обрабатывает изображения такого типа. Мы должны придерживаться этого, чтобы наши приложения не выглядели абсурдно после обновлений iOS. 23.09.2014
  • Как я могу сделать это с помощью Swift? 24.07.2015
  • Это не работает в Xcode 7.3/Swift 2.2: это не позволит вам использовать целое число в параметре initWithBarButtonSystemItem. 10.05.2016

  • 5

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

    09.11.2013

    6

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

    • Поместите курсор туда, где вы хотите, чтобы символ отображался (например, поле title в IB или в кавычках в коде).
    • В меню Xcode нажмите «Изменить», затем «Эмодзи и символы». (Кроме того, нажмите Ctrl-Command-Space, чтобы открыть список символов.)
    • В поле поиска введите меньше или больше.
    • Затем выберите нужный символ.

    По умолчанию символы «меньше» и «больше» на панели инструментов окрашены в синий цвет.

    В коде:

    backButton.title = "<"
    

    In IB:

    control-command-нажмите, чтобы вызвать эмодзи и символы

    10.05.2016

    7

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

    Но он использует сегментированный элемент управления, который стал плоским в iOS 7.

    Изменить: просто измените текст сегментов:

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

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

    28.09.2013
  • Это то, что я использую. Мне просто интересно, как изменить сегментированный элемент управления только на символы ‹›. 29.09.2013
  • Вы имеете в виду, просто измените текст в источнике кода BSKeyboard: 04.10.2013
  • Нет, я имею в виду использование стрелок iOS 7. Например, на элементах навигации. 04.10.2013
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..