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