UIAlertController - способ получить представления для сообщений и действий? - PullRequest
0 голосов
/ 20 июня 2019

Нам нужно использовать UITextView (т.е. многострочный текстовый ввод), чтобы позволить пользователю вводить информацию. UITextView плохо работает с автоматическим изменением размера, поэтому мы устанавливаем ограничения, используя границы вида UIAlertController. В зависимости от настроек специальных возможностей возникают проблемы с макетом.

Например, это макет, красивый и аккуратный, при больших настройках текста:

enter image description here

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

enter image description here

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

"Legal", потому что официальная документация для UIAlertController указывает ( выделение мое):

Важно

Класс UIAlertController предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представления для этого класса является приватной и не должна изменяться.

И подтвердили, что действия (кнопки Cancel и Submit), кажется, не видны, когда мы выполняем итерацию по [[alertController view] subviews], поэтому мы должны быть осторожны.

Кроме того, safeAreaInsets - это {0, 0, 0, 0} для всех моделей iPhone, так что здесь это не поможет.

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

Это старое приложение, поэтому мы кодируем в Objective-C, но решения Swift тоже подойдут.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Я рекомендую вам использовать правильный метод из UiKit, addTextFieldWithConfigurationHandler : Например:

-(void)showAlert{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Defining by Words Only" message:@"Enter the words you want to use,separated by spaces." preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *action = [UIAlertAction actionWithTitle:@"Submit Words" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
[self submitWordsMethods:alert.textFields.firstObject.text];}];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];

    //Doesn't allow to send a empty answer.
    [alert addAction: action];
    [action setEnabled:NO];
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        //Text field activates el boton de enviar cuando tiene texto.
        [textField addTarget:self action:@selector(alertControllerTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
    }];
    [alert addAction: cancel];
    [self presentViewController:alert animated:YES completion:nil];
}

Это результат:

enter image description here

0 голосов
/ 21 июня 2019

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

Мы рассмотрели проблему и обнаружили, что нам нужно беспокоиться только о трех случаях, а именно о категориях предпочтительного размера контента XL, XXL и XXXL. Мы обращались с ними напрямую:

NSString *sizeCategory = UIScreen.mainScreen.traitCollection.preferredContentSizeCategory;
CGFloat top = -82.f;
CGFloat bottom = +52.0f;
if ([sizeCategory isEqualToString:UIContentSizeCategoryExtraLarge])
{
    top = -90.0f;
    bottom = +98.0f;
}
else if ([sizeCategory isEqualToString:UIContentSizeCategoryExtraExtraLarge])
{
    top = -118.0f;
    bottom = +98.0f;
}
else if ([sizeCategory isEqualToString:UIContentSizeCategoryExtraExtraExtraLarge])
{
    top = -160.0f;
    bottom = +98.0f;
}

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

В настоящее время мы не обрабатываем дополнительные размеры текста в разделе «Большие размеры доступности». Приложение в целом требует минимального уровня остроты зрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...