В моем проекте 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 и, если возможно, хотел бы продолжать в том же духе.
Любое предложение будет очень, очень оценено!
Заранее спасибо,
Чезаре
intrinsicContentSize
; возможно, он не может получить внутренний размер из своего содержимого. Зарегистрируйте сегментированный элемент управленияconstraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal
. - person Ken Thomases   schedule 04.04.2015