2015-12-08 2 views
1

Я пытаюсь просто центрировать мой GridView с программными ограничениями Autolayout. Ответ, который был предложен here и here рекомендуют использоватьПочему мое центрирование с использованием ограничений Autolayout программно не работает?

NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, 
      toItem: self.gridView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant:0) 

Я добавляю ограничения следующим образом:

func setupConstraints() { 

    let centerX = NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, 
     toItem: self.gridView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant:0) 

    let centerY = NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, 
     toItem: self.gridView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant:0) 

    self.view.addConstraints([centerX, centerY]) 
} 

Однако, это не похоже на работу для меня. При запуске приложения представление расположено в верхнем левом углу, а консоль показывает дикий выход о проблемах с одновременным удовлетворением ограничений.

enter image description here

+0

Какие еще ограничения активны в вашем представлении? – Stonz2

+0

пока нет ... Я хочу добавить один для размера позже, используя язык визуального формата '[gridView (100 @ 100)]', но его там пока нет. – nburk

+0

", а консоль показывает дикий выход о проблемах с одновременным удовлетворением ограничений.« И в этом проблема. Это не «дикий»; это чрезвычайно информативно. Вам нужно _read_ этот вывод. Если вы не можете, то _quote_ это в ваш вопрос. Остановитесь, начните думать. – matt

ответ

3

Это должно работать:

func setupConstraints() { 

    self.viewToCenter.translatesAutoresizingMaskIntoConstraints = false 
    NSLayoutConstraint(item: self.viewToCenter, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, 
     toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant:0).active = true 

    NSLayoutConstraint(item: self.viewToCenter, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, 
     toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant:0).active = true 
} 

Ваш первый и второй элементы были неправильными и не использовать , потому что он будет или будет устаревшим (iOS < = 8).

+0

Это работает, я действительно думаю, что проблема в том, что я не установил 'self.viewToCenter.translatesAutoresizingMaskIntoConstraints = false' ... однако центрирование по-прежнему не работает с этим кодом. чтобы сделать пример еще проще, я заменил свой «GridView» на простой «UIView», но он все еще не работает (на самом деле, представление вообще не отображается, оно даже не существует, когда я использую _view debugging_ in Xcode ...). Думаю, я должен говорить об этом в другом вопросе. – nburk

+0

Вы когда-нибудь пытались установить ограничения ширины и высоты? AutoLayout может время от времени ломать нормальные кадры! – DevAndArtist

+0

Я использовал, используя 'NSLayoutConstraint.constraintsWithVisualFormat (" [gridView (100 @ 100)] ", опции: NSLayoutFormatOptions.AlignAllCenterX, метрики: nil, views: [" gridView ": self.gridView])', ... странный Дело в том, что когда я регистрирую кадр до и после 'setupConstraints()', вывод ** оба раза ** есть '> ', за исключением того, что вид исчез – nburk

1

Я думаю, что вы не добавите этот код

self.gridView.translatesAutoresizingMaskIntoConstraints = false 
Смежные вопросы