Последние пару месяцев я создавал приложения для опросов, и эта точная проблема возникала несколько раз. Хотя UIPickerView
в основном имеет смысл, он не позволяет пользователю видеть больше, чем несколько вариантов одновременно, и плохо масштабируется от iPhone 4s до 6+ или iPad.
Первое, что я бы порекомендовал, это создать кнопку для выпадающего меню. Я обнаружил, что почти все, что отдаленно выглядит как кнопка, работает хорошо, но сделать это похожим на гиперссылку или слишком встроенным в то, что его окружает, не так хорошо с точки зрения UX.
Вот как выглядит кнопка, которую я использую: ![Это просто UIButton с рамкой](https://i.stack. imgur.com/IFDyG.jpg)
Все что есть а. UIButton с тонкой рамкой вокруг него с угловым радиусом ~5.
Что касается фактического выпадающего списка, я обнаружил, что всплывающие окна в целом довольно эффективны. Самой простой реализацией для меня было использование UIAlertController
. (Это доступно только в iOS 8+, но в любом случае должно подойти, если вы работаете быстро.) С UIAlertController
у вас может быть очень большое количество опций, кнопка отмены, которая легко доступна, заголовок, сообщение, все представлено для пользователем очень стандартным способом. Вы можете установить действия для каждой кнопки при создании контроллера, чтобы вам вообще не приходилось работать с делегатами, что делает ваш код чище.
Вот как выглядит контроллер предупреждений для моего предыдущего примера. Это на iPhone 5s в альбомной ориентации, что является наименьшим возможным макетом, но он автоматически масштабируется по мере необходимости для любого размера экрана и предлагает аналогичный опыт для пользователя. ![UIAlertController в виде раскрывающегося меню](https://i.stack.imgur.com/JVEW2.jpg)
Когда пользователь выбрал ответ, обновите текст кнопки, чтобы он соответствовал новому ответу.
Вместо того, чтобы использовать 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