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+, но така или иначе трябва да е добре, ако работите в swift.) С 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 точки. Създаването на бутон, който изглежда добре, е в една линия и е лесен за натискане с пръст, е трудно. Popovers обаче до голяма степен решават този проблем. - 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
А, добре. Използвах страница, за да ми помогне да я разбера по-добре, когато използвам swift, който е подобен на вашия. 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