2017-01-10 7 views
2

У меня есть UIComponent, который представляет собой простой вид (я сузил проблему). Вот XIB и класс:Как узнать ширину UIComponent во время выполнения?

enter image description here

Тогда я положил этот компонент в представлении в раскадровке, устанавливает свои ограничения:

enter image description here

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

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

Фактически, значение всегда является фактической шириной компонента в раскадровке.

Это настолько странно. Есть ли способ узнать фактическую ширину UIComponent?

Помощь больш была бы оценена :)

+0

Как ограничения сконфигурированных? – Scriptable

+0

@ Эрик. Какое значение оно печатает для 'print (self.frame.width)'? Отображает ли оно какое-либо значение или возвращает ноль? Как именно вы установили значения 'NSLayoutConstraint' для' StatBarView'? Вы установили, что они имеют относительную ширину или равную ей ширину, или же левую и правую стороны ограничены левым и правым краями надзора? – Pierce

+0

StatBarView имеет исправления высоты, центрированные по вертикали, а левая и правая стороны ограничены для просмотра. Значение, напечатанное, представляет собой ширину StatBarView раскадровки, которая не соответствует ширине во время выполнения. Например, если я устанавливаю iPhone SE в раскадровку, ширина составляет 239 пикселей, и это значение используется даже при выполнении на iPhone 7 плюс. – Eric

ответ

1

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

(простите за 2 ответов ^^ они слишком разные)

+0

Спасибо, это работает, вы рок! !! – Eric

1

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

Например, вы должны сделать что-то вроде этого

NSLayoutConstraint(item: element, attribute: .width, relatedBy: .equal, toItem: parentView, attribute: .width, multiplier: 0.5, constant: 0) 

сделать элемент занимает 50% от его ширины parentView

Затем, если вы хотите изменить его, вы должны заменить старые ограничения с новым один с новым желаемым множителем, конечно. Такая перетасовка с заменой существует, потому что свойство множителя получает только

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

+0

Спасибо за помощь @Pavel.Пытался внедрить эту строку в сеттер моих переменных, но он сбой с «Неверная иерархия просмотра для ограничения». Во всяком случае, subviews изменяются, когда я устанавливаю процентное значение, но оно вычисляется по ширине родителя, что неверно. Это моя проблема. Я не понимаю, почему 'self.frame.width' не получает значение во время выполнения, но получает значение из раскадровки (что, кроме того, я не устанавливал в качестве ограничения!) – Eric

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