Swift/iOS - какая альтернатива нескольким выпадающим спискам Android

Я новичок в iOS и Swift. Я делаю приложение для Android уже пару лет. Я изучаю Swift и делаю его для устройств iOS.

Мне нужна помощь с альтернативными способами раскрывающихся списков, так как это то, что я использую в Android.

Я изучал UIPickerViews, UIPopovers с табличными представлениями и многое другое.

Дело в том, что мне нужно несколько альтернативных выпадающих списков в одном ViewController.

Вот вид в моем приложении для Android, который я хочу выглядеть очень похожим в своей версии для iOS. img src="https://i.stack.imgur.com/8HtfY.png" alt="введите здесь описание изображения">


person Matthew White    schedule 10.10.2015    source источник


Ответы (1)


Последние пару месяцев я создавал приложения для опросов, и эта точная проблема возникала несколько раз. Хотя UIPickerView в основном имеет смысл, он не позволяет пользователю видеть больше, чем несколько вариантов одновременно, и плохо масштабируется от iPhone 4s до 6+ или iPad.

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

Вот как выглядит кнопка, которую я использую: Это просто UIButton с рамкой

Все что есть а. UIButton с тонкой рамкой вокруг него с угловым радиусом ~5.

Что касается фактического выпадающего списка, я обнаружил, что всплывающие окна в целом довольно эффективны. Самой простой реализацией для меня было использование UIAlertController. (Это доступно только в iOS 8+, но в любом случае должно подойти, если вы работаете быстро.) С UIAlertController у вас может быть очень большое количество опций, кнопка отмены, которая легко доступна, заголовок, сообщение, все представлено для пользователем очень стандартным способом. Вы можете установить действия для каждой кнопки при создании контроллера, чтобы вам вообще не приходилось работать с делегатами, что делает ваш код чище.

Вот как выглядит контроллер предупреждений для моего предыдущего примера. Это на iPhone 5s в альбомной ориентации, что является наименьшим возможным макетом, но он автоматически масштабируется по мере необходимости для любого размера экрана и предлагает аналогичный опыт для пользователя. UIAlertController в виде раскрывающегося меню

Когда пользователь выбрал ответ, обновите текст кнопки, чтобы он соответствовал новому ответу.

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

Я чувствую, что должен добавить, что причина, по которой я использую UIAlertController вместо UIPickerView, является преднамеренной, поскольку это позволяет пользователю одновременно видеть больше параметров и использовать доступный размер экрана на iPad и более крупных iPhone. Кроме того, обратная связь после выбора происходит мгновенно, так как представление исчезает, как только выбор сделан, Cancel – это стандартное действие, которое позволяет пользователю быстро не делать выбор и не требует пользователь может прокручивать, если есть только несколько вариантов, что означает, что выбор может быть сделан всего одним нажатием.

Вот код, который я использовал для создания кнопки и соответствующей UIAlertController:

if (self.question.placeholderText) {
    [self.answerButton setTitle:NSLocalizedString(self.question.placeholderText, @"") forState:UIControlStateNormal];
} else {
    [self.answerButton setTitle:NSLocalizedString(@"Please Select One", nil) forState:UIControlStateNormal];
}
[self.answerButton setTitle:[self paddedString:self.answerButton.titleLabel.text] forState:UIControlStateNormal];
self.answerButton.titleLabel.textAlignment = NSTextAlignmentLeft;
self.answerButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
self.answerButton.titleLabel.font = [UIFont appFont];
[self.answerButton setTitleColor:[UIColor appColor] forState:UIControlStateNormal];
[self.answerButton addTarget:self action:@selector(longListLabelTapped) forControlEvents:UIControlEventTouchUpInside];
self.answerButton.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.0001f];
self.answerButton.titleLabel.layer.borderColor = [UIColor appColor].CGColor;
self.answerButton.titleLabel.layer.borderWidth = 1.0f;
self.answerButton.titleLabel.layer.cornerRadius = 5.0f;

- (NSString *)paddedString:(NSString *)input {
    //This adds some space around the button title just to make it look better
    return [NSString stringWithFormat:@"  %@  ", input];
}

Чтобы создать UIAlertController, вам понадобится множество вариантов.

_optionsController = [UIAlertController
                      alertControllerWithTitle:self.question.longListTitle
                      message:nil
                      preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

}];
[_optionsController addAction:cancelAction];


for (NSString *optionName in self.question.possibleAnswers) {
    UIAlertAction *action = [UIAlertAction actionWithTitle:optionName
                                                     style:UIAlertActionStyleDefault
                                                   handler:^(UIAlertAction *action) {
                                                       // Do something with the selected answer
                                                       [self.answerButton setTitle:[self paddedString:optionName] 
                                                                          forState:UIControlStateNormal];
                                                   }];
    [_optionsController addAction:action];
}
person Fennelouski    schedule 10.10.2015
comment
Это кажется очень хорошим способом сделать это. Я видел это в своем похожем приложении, где вы нажимаете на что-то, похожее на текстовое поле, но открывает ощущение типа AlertController, и когда выбор выбран, он заполняется этим текстом имени выбора, в этом текстовом поле. Спасибо большое. Кажется, это лучший способ сделать это. - person Matthew White; 10.10.2015
comment
Я дам ему еще немного времени, потому что я отмечаю как ответ, но это кажется очень хорошим. - person Matthew White; 10.10.2015
comment
Одна из вещей, упомянутых в Руководстве по человеческому интерфейсу, о которой часто забывают при попытке скопировать дизайн с других платформ, — это минимальный размер кнопки 44 pt. Создать кнопку, которая хорошо выглядит, находится на одной линии и по которой легко нажимать пальцем, сложно. Однако всплывающие окна в значительной степени решают эту проблему. - person Fennelouski; 10.10.2015
comment
Думаете, вы можете отправить по электронной почте несколько советов и код о том, как это сделать? Мне нравится твой. Мне нужна помощь. - person Matthew White; 10.10.2015
comment
Я только что добавил пример кода для того, что я использую, чтобы получить вид, который я делаю. Я удалил большую часть контекста, но есть основная часть того, что заставляет его работать, и его должно быть довольно легко реализовать в вашем собственном коде. Я также защищал, почему я использую UIAlertController вместо UIPickerView. - person Fennelouski; 11.10.2015
comment
Просто чтобы уточнить, является ли вопрос ярлыком? - person Matthew White; 12.10.2015
comment
question — это свойство, которое представляет собой настраиваемый объект, который я создал для представления вопросов из опроса. - person Fennelouski; 13.10.2015
comment
Ох, ладно. Я использовал страницу, чтобы помочь мне лучше понять ее при использовании быстрого, который похож на ваш. stackoverflow.com/questions/27880588/ - person Matthew White; 13.10.2015
comment
Вечером после работы обязательно все это попробую. Выглядит очень многообещающе. - person Matthew White; 13.10.2015
comment
Это работает удивительно хорошо. Спасибо чувак. Пока лучшее решение. Я отметил это как ответ? Я не уверен, правильно я сделал или нет. - person Matthew White; 13.10.2015
comment
Я рад, что это работает! Оглядываясь назад на этот код, я вижу больше мелких деталей, которые я не очень хорошо объяснил, поэтому я рад, что он хорошо сработал для вас. Спасибо, что приняли ответ. - person Fennelouski; 13.10.2015