Добавить конечное ограничение между двумя представлениями

Я застрял со странным поведением

Я программно добавил конечное ограничение между UISlider и UILabel, оно выглядит так:

NSLayoutConstraint *timeLabelTrailing = [NSLayoutConstraint
                                             constraintWithItem:_timeLbl
                                             attribute:NSLayoutAttributeTrailing
                                             relatedBy:NSLayoutRelationEqual
                                             toItem:_seekBar
                                             attribute:NSLayoutAttributeTrailing
                                             multiplier:1
                                             constant:0];

    [timeLabelTrailing setActive:true];
    [self layoutIfNeeded];

И завершение «UILabel» не будет соответствовать завершению «UISlider».

Я попытался сделать то же самое между представлениями «UILabel» и «UIViewControoler», и он работает нормально, но с «UISlider» все идет не так.

Прикрепил несколько фото из ViewDebugger:

слайдер

первое фото

ярлык

фото два


person dudi hisine    schedule 23.08.2018    source источник
comment
По вашему образу непонятно, что к чему. 1) Первый скриншот на UISlider, а второй только на этикетке? 2) вы изменили настройки Viewdebugger?   -  person Honey    schedule 23.08.2018
comment
Вы установили translatesautoresizingmaskintoconstraints на ярлыке и слайдере на false?   -  person Honey    schedule 23.08.2018
comment
1. я ничего не делал с отладчиком 2. да, я установил значение false   -  person dudi hisine    schedule 23.08.2018
comment
Вы делаете что-то странное со своим _seekBar? Судя по вашему изображению, его frame width больше, чем его _3 _...   -  person DonMag    schedule 23.08.2018
comment
Это потому, что вы поместили их в стек. Я прав? Это все усложняет ...   -  person Honey    schedule 23.08.2018
comment
Итак, как я могу это сделать и оставить слайдер внутри stackView?   -  person dudi hisine    schedule 23.08.2018
comment
возможно, вы захотите отредактировать вопрос и включить настройку просмотра стека ...   -  person Honey    schedule 23.08.2018
comment
Я сделаю это спасибо   -  person dudi hisine    schedule 23.08.2018
comment
Я также отредактировал свой ответ и добавил дополнительную информацию   -  person Honey    schedule 23.08.2018


Ответы (1)


Это потому, что вы поместили их в стек! Следовательно, stackview подавляет другие ограничения.

Как я узнаю, что он подавляется?

Viewdebugger - чрезвычайно мощный инструмент, но большинство его функций неизвестны.

Цвет ограничений справа передает смысл.

  • Тёмно-чёрные ограничения оказывают влияние.
  • Светло-серые ограничения игнорируются либо из-за того, что они подавлены более высоким приоритетом, либо из-за конфликтов между ограничениями, что означает, что механизм макета будет принимать решение самостоятельно. Поведение этого решения непредсказуемо.

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

введите здесь описание изображения

Как видите, label.trailing = self.trailing @1000 игнорируется. И когда у вас есть приоритет с игнорированием «1000», я почти уверен, что отладчик выдает вам предупреждения, но вы не упомянули их в своем вопросе.

Короче говоря, когда вы помещаете вещи в стек, вы не должны сами добавлять много ограничений.

  • Следует в значительной степени избегать ограничений, связанных с «положением».
  • Ограничения, связанные с размером, немного приемлемы.

Я думаю, что тебе может понадобиться

stackView.alignment = .trailing

И убедитесь, что вы удалили другие конечные ограничения.

И если вы хотите, чтобы ваш слайдер растягивался на всю ширину представления стека, ограничьте его шириной представления стека. Метка получает ширину от своего intrinsicContentSize, и это нормально.

введите здесь описание изображения

TBH Я не уверен, что это лучший подход, но я думаю, что он работает. Если кто-то знает способ лучше, оставьте, пожалуйста, комментарий.

person Honey    schedule 23.08.2018