0

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

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

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

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

  • Leading пространства для SuperView == 0
  • Продольного пространства для сегментированного контроллера> = 8
  • сверху и снизу пространство для других элементов интерфейса == 8

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

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

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

myButton.setTitle(aStringThatSometimesIsPrettyLong, forState: .Normal) 

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

До сих пор я пытался, по отдельности и вместе, эти шаги:

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

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

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

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

Любое предложение действительно было бы действительно оценено!

Спасибо заранее,

Cesare

+0

Похоже, вы пробовали правильные вещи. А именно, он должен работать, чтобы уменьшить приоритет устойчивости к горизонтальному сжатию кнопки ниже, чем для сегментированного управления. Что нужно попробовать: запишите «intrinsicContentSize» сегментированного элемента управления; возможно, он не может получить собственный размер из своего контента. Запишите «ограничения» сегментированного элемента управления: «ЭффектLayoutForAxis: UILayoutConstraintAxisHorizontal». –

+0

@KenThomases Большое спасибо, проблема действительно была сегментированным элементом управления intrinsicContentSize, теперь все в порядке. Я очень ценю вашу помощь, еще раз спасибо! Мне жаль, что я не могу принять ваш ответ, так как это комментарий ... Счастливая Пасха! – cdf1982

+0

Добро пожаловать. Из любопытства, как сегментированный контроль настроил так, что он не имел собственного размера? –

ответ

0

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

Смежные вопросы