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

В моем проекте Xcode 6.2 Swift у меня есть проблема с автоматическим макетом (я также использую классы размеров), которую я не могу понять...

В Main.storyboard у меня есть представление, содержащее, среди прочих элементов интерфейса, UIButton и UISegmentedControl, которые расположены на одной высоте на противоположной стороне представления.

Я вручную устанавливаю все ограничения в Interface Builder (ни одного в коде), и каждое мое представление работает нормально, за исключением этого случая (и эта конкретная проблема возникает только при наличии длинного текста).

Кнопка выравнивается по левой границе представления и имеет следующие ограничения:

  • Ведущее пространство для супервизора == 0
  • Конечный пробел для сегментированного контроллера >= 8
  • Верхнее и нижнее пространство для других элементов интерфейса == 8

Сегментированный контроллер (который имеет 2 сегмента) выровнен по правой границе представления, и его ограничения:

  • Завершающий пробел для супервизора == 0
  • Пробел перед кнопкой >= 8
  • Верхнее и нижнее пространство для других элементов интерфейса == 8

Кнопка в раскадровке имеет заголовок «Некоторый заголовок», но на самом деле фактический заголовок всегда задается в коде в ViewWillAppear:

myButton.setTitle(aStringThatSometimesIsPrettyLong, forState: .Normal)

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

До сих пор я пробовал по отдельности и вместе следующие шаги:

  • Добавление ограничения минимальной ширины к сегментированному элементу управления.
  • Увеличено (с шагом до 1000) сопротивление сжатию содержимого сегментированного элемента управления при уменьшении соответствующего значения кнопки.
  • Увеличен (до 1000) приоритет содержимого кнопки.
  • Я думаю, что не могу установить максимальную ширину для кнопки, потому что она может растягиваться в зависимости от заголовка, заданного в коде, и, что более важно, от того, на каком устройстве запущено приложение.

Моя самая большая проблема заключается в том, что, что бы я ни пытался, при запуске приложения я всегда получаю одно и то же поведение (полностью отображаемый заголовок кнопки, неусеченный и сжатый сегментированный элемент управления). Это похоже на добавление эти ограничения ничего не меняют, и это никогда не случалось со мной раньше с авто-макетом... много путаницы, но без изменений добавление ограничений, это новшество!

Возможно, проблема в том, что заголовок кнопки установлен в ViewWillAppear, а не в раскадровке, но мое приложение не будет работать должным образом, если я не смогу установить его заголовок в коде.

Последнее, но очень важное, я должен признать, что, хотя мне до сих пор удавалось заставить классы Auto-layout и Size работать на всех устройствах и ориентациях для всех (более 10) контроллеров представления моего приложения, я на самом деле никогда не написал одну строку кода для классов Auto.layout и Size: Я сделал все в Interface Builder и, если возможно, хотел бы продолжать в том же духе.

Любое предложение будет очень, очень оценено!

Заранее спасибо,

Чезаре


person cdf1982    schedule 04.04.2015    source источник
comment
Похоже, вы пробовали правильные вещи. А именно, он должен работать, чтобы уменьшить приоритет сопротивления горизонтальному сжатию кнопки до уровня ниже, чем у сегментированного элемента управления. Что можно попробовать: зарегистрируйте сегментированный элемент управления intrinsicContentSize; возможно, он не может получить внутренний размер из своего содержимого. Зарегистрируйте сегментированный элемент управления constraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal.   -  person Ken Thomases    schedule 04.04.2015
comment
@KenThomases Большое спасибо, проблема действительно заключалась в сегментированном элементе управления innerContentSize, теперь все в порядке. Я очень ценю вашу помощь, еще раз спасибо! Мне только жаль, что я не могу принять ваш ответ, так как это комментарий... С Пасхой!   -  person cdf1982    schedule 05.04.2015
comment
Пожалуйста. Из любопытства, как был настроен сегментированный элемент управления, чтобы он не имел собственного размера?   -  person Ken Thomases    schedule 05.04.2015
comment
@KenThomases Я буду выглядеть очень плохо, отвечая на это ... Я не смог понять это, поэтому удалил сегментированный элемент управления и создал новый. Мое частичное оправдание в том, что я довольно новичок в программировании, но все равно чувствую себя плохо...   -  person cdf1982    schedule 06.04.2015
comment
Не чувствуй себя плохо. Мне просто было любопытно. Я рад, что у вас все получилось, даже если мы не поняли, что именно не так. :)   -  person Ken Thomases    schedule 06.04.2015


Ответы (1)


Как указал @KenThomases, ограничения, которые я устанавливал, были на самом деле правильными (на самом деле, теперь он также работает с меньшими ограничениями, когда благодаря его ответу я понял проблему), но элемент управления Segmented не получил свой встроенныйContentSize. Исправил, теперь все в порядке.

person cdf1982    schedule 05.04.2015