Ошибка LayoutConstraints без использования Auto Layout - PullRequest
0 голосов
/ 10 мая 2019

Я не использовал Auto Layout в своей раскадровке и не реализовывал никакого кода для этого. У меня есть UIAlertController для входа в систему и ошибка LayoutConstraints при вводе текста с клавиатуры.

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

Я использую Xcode Version 10.1 (10B61) и поместил точку останова UIViewAlertForUnsatisfiableConstraints в Debug, которая указывает на ряд ошибок ограничения.

Пройдя все контрольные точки, я получаю в консоли следующее сообщение:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x60000165fe80 h=--& v=--& UIKeyboardAssistantBar:0x7f922cd1aa30.height == 0   (active)>",
    "<NSLayoutConstraint:0x6000016768f0 V:|-(0)-[_UIButtonBarStackView:0x7f922cd1d6e0]   (active, names: '|':UIKeyboardAssistantBar:0x7f922cd1aa30 )>",
    "<NSLayoutConstraint:0x600001676a80 V:[_UIButtonBarStackView:0x7f922cd1d6e0]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f922cd1aa30 )>",
    "<NSLayoutConstraint:0x60000165f340 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f922cf87400.height == UILayoutGuide:0x600000c39260'UIViewLayoutMarginsGuide'.height   (active)>",
    "<NSLayoutConstraint:0x6000016764e0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600000c39260'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f922cd1d6e0 )>",
    "<NSLayoutConstraint:0x600001676440 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600000c39260'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f922cd1d6e0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000016764e0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600000c39260'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f922cd1d6e0 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Я тщательно прошел через раскадровку и не нашел никаких ограничений для Auto Layout.

Я реализовал код в каждом UIView, чтобы отключить ограничения [self.view removeConstraints:self.view.constraints];

Может ли это быть ошибкой Apple, поскольку она не возникает на реальном устройстве?

Вот код для приглашения пользователя для входа в систему и ввода с клавиатуры через UIAlertController:

-(void) promptUserLogin
{
    NSString *alertTitle = @"User Login Required";
    NSString *alertMessage = @"Enter Email and Password";

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:alertTitle
                                                                             message:alertMessage
                                                                      preferredStyle:UIAlertControllerStyleAlert];

    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
     {
         textField.placeholder = @"User Email";
         [textField addTarget:self action:@selector(alertTextFieldDidChange:)
             forControlEvents:UIControlEventEditingChanged];
     }];

    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
     {
         textField.placeholder = @"User Password";
         textField.secureTextEntry = YES;
     }];

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle: @"Cancel"
                                                           style:UIAlertActionStyleCancel
                                                         handler:^(UIAlertAction *action)
                                   {
                                       NSLog(@"Cancel action");
                                   }];

    UIAlertAction *okAction = [UIAlertAction actionWithTitle: @"OK"
                                                       style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction *action)
                               {
                                   UITextField *login = alertController.textFields.firstObject;
                                   UITextField *password = alertController.textFields.lastObject;

                                   NSLog(@"OK Action");
                                   NSLog(@"Login String: %@",login.text);
                                   NSLog(@"Password String: %@",password.text);
                               }];

    okAction.enabled = NO;
    [alertController addAction:cancelAction];
    [alertController addAction:okAction];

    //[self presentViewController:alertController animated:YES completion:nil];
    [self.navigationController presentViewController:alertController animated:YES completion:nil];
}

- (void)alertTextFieldDidChange:(UITextField *)sender
{
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
    if (alertController)
    {
        UITextField *login = alertController.textFields.firstObject;
        UIAlertAction *okAction = alertController.actions.lastObject;
        okAction.enabled = login.text.length > 2;
    }
}

1 Ответ

1 голос
/ 11 мая 2019

Я не верю, что это как-то связано с вашими проблемами с макетом. Это связано с тем, что InputAssistantItems (над клавиатурой) не работает автоматически. Если вы посмотрите на первое ограничение авторазмера, указанное в ошибках авторазметки, оно ссылается на UIKeyboardAssistantBar.

Немного подробнее о том, как вы можете воспроизвести его:

При использовании UITextField, для которого inputAssistantItem не содержит никаких предложений автокоррекции (либо это безопасное текстовое поле, либо для autocorrectionType установлено значение UIAutoCorrectionTypeNo), это нарушает ограничения автоматического макета (я могу воспроизводить его только в определенных сценариях, когда переключение между UITextFields или отставка / активация).

Это происходит в 2 сценариях:

  1. В текстовом поле для autocorrectionType установлено значение UITextAutoCorrectionTypeNo.
  2. Текстовое поле является защищенным текстовым полем.

В обоих случаях центр UIButtonBarStackView будет пуст (не содержит предложений по автозамене).

Эта проблема не возникает, когда вы отключаете inputAssistantItem, устанавливая начальные / конечные группы BarButtonGe в пустой массив, или используете текстовое поле с включенной автокоррекцией.

Edit:

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

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