2017-01-30 22 views
0

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

Вот мой код:

let centerXConstraint = NSLayoutConstraint(item: self.volumeSliderP, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerX, multiplier: 1.0, constant: 10.0) 

self.view.addConstraint(centerXConstraint) 

Я должен упомянуть, что, когда я заменяю первый item для слайдера, который уже существует на представлении (которое было размещено через Storyboard, с его собственными ограничениями, также помещенными в IB/Storyboard), оно верно обновляется с приведенным выше кодом NSLayoutConstraint. Кроме того, я смог обновить свой запрограммированный volumeSliderP с помощью специального кода, чтобы изменить его дескриптор и повернуть его вертикально.

Какой шаг я пропускаю, чтобы этот код NSLayoutConstraint работал на моем запрограммированном слайдере?

Благодарим за помощь!

+0

Вы можете показать полный код создания слайдера и добавить ограничения? –

ответ

1

При работе с ограничениями в коде, вам нужно сделать два (возможно три) вещи, независимо от типа управления:

  • Установите translatesAutoresizingMaskIntoConstraints ложь.

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

public func turnOffAutoResizing() { 
    self.translatesAutoresizingMaskIntoConstraints = false 
    for view in self.subviews as [UIView] { 
     view.translatesAutoresizingMaskIntoConstraints = false 
    } 
} 

Затем в viewDidLoad (после добавления своих подвидов) Я просто добавить строку:

view.turnOffAutoResizing() 

Как указано в связанном документе Apple, если у вас есть ярлык и текстовое поле, текстовое поле будет расширяться, чтобы соответствовать метке без необходимости устанавливать ширину. UISlider не имеет внутренней ширины, но имеет внутреннюю высоту.

  • Так что в вашем случае вам нужно не только установить положение, но и определить ширину.

Сочетание top и leading даст достаточно для расположения двигателя, чтобы знать «где» и «высота», но не «ширина». То же самое произойдет, если вы определили «centerX» и что-то - вы не указали код - для коэффициента Y (сверху, снизу, в центре Y).

Если я заявляю это ясно, вы должны уметь видеть, что двигатель будет знать достаточно, чтобы сказать (в координатах кадра) «запустить ползунок в X/Y, высота - XX точек (имеет внутреннюю высоту) , но как долго это должно быть? "

Обычно я устанавливаю верхнюю, ведущую и конечную ... или верхнюю, центральную и ширину. Но это зависит от потребности.

+0

Отличный ответ! Спасибо!(для записи я применяю «равную ширину для супервизора * мульти» и centerX, поэтому одно и то же местоположение будет работать на экранах iPad различного размера) – PlateReverb