iOS 10, swift 4.1, установка верхней привязки представления для topLayoutGuide нижней привязки, вызывающей конфликты - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь установить позицию моего представления, чтобы быть под строкой состояния.Это работает с safeAreaLayoutGuide в iOS 11+, но я пытаюсь использовать предложение, которое я нашел в Интернете для <11. </p>

Вот что я пытаюсь.

if #available(iOS 11.0, *) {
    let guide = parentController.view.safeAreaLayoutGuide
    NSLayoutConstraint.activate([view.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
                                 view.centerXAnchor.constraint(equalTo: parentController.view.centerXAnchor)])
} else {
    NSLayoutConstraint.activate([view.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor),
                                 view.centerXAnchor.constraint(equalTo: parentController.view.centerXAnchor)])
}

В случае iOS 10 я получаю эту проблему (ниже), не уверенную, откуда возникает этот конфликт.

2018-09-19 13:31:20.097129 iOSTestAppSingleWorkspace[70650:12307124] [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. 
(
    "<_UILayoutSupportConstraint:0x60000028d020 _UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide'.height == 20   (active)>",
    "<_UILayoutSupportConstraint:0x60000028ce40 V:|-(0)-[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']   (active, names: '|':UIView:0x7f92864249c0 )>",
    "<NSLayoutConstraint:0x60000028d0c0 V:[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']-(0)-[UIView:0x7f92864249c0]   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60000028d0c0 V:[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']-(0)-[UIView:0x7f92864249c0]   (active)>

Иерархия представляет собой UIViewController (parentController) с дочерним контроллером представления (где этот кодвыполняется, со ссылкой на родительский контроллер)

Дочернее представление добавляется в коде и может быть размещено в разных позициях на экране, в этом случае оно находится в центре вверху.

1 Ответ

0 голосов
/ 20 сентября 2018

Верхнее руководство по разметке вашего дочернего представления контроллеров не будет ссылаться на верхнее руководство по разметке вашего родительского представления контроллера.Точно так же, как вы сделали это с руководством по компоновке для вставок безопасной области, вам будет хорошо, если вы обратитесь к руководству по компоновке представления вашего родительского контроллера.Я полагаю, что конфликт возникает из-за того, что вы добавили второе ограничение, которое гласит «мой взгляд ниже моего верхнего руководства по макету», что уже имеет место по умолчанию

...