2016-12-22 9 views
2

Я пытаюсь отцентрировать изображение на вид, но я получаю error..this мой код:Получение динамических ошибок при добавлении ограничений

let markerimage = #imageLiteral(resourceName: "ic_new_mark_icon") 

    let size = CGSize(width: 60, height: 60) 

    var newimage = imageWithImage(image: markerimage, scaledToSize: size) 

    var imageview = UIImageView(image: newimage) 

    self.view.addSubview(imageview) 


    let xConstraint = NSLayoutConstraint(item: imageview, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0) 

    let yConstraint = NSLayoutConstraint(item: imageview, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0) 

    imageview.addConstraint(xConstraint) 
    imageview.addConstraint(yConstraint) 

и моя ошибка

2016-12-22 16:29:11.305417 Googlemappractice[21426:362773] [LayoutConstraints] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x600000285f00 UIImageView:0x7ff772f15560.centerX == UIView:0x7ff772c0bd30.centerX (inactive)> 
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) 
+0

Вам нужно добавить эти ограничения в self.view, а не в виде изображения. Кроме того, убедитесь, что вы отключили флаг авторазрешения (возможно, у вас есть, но я не видел этот код). – dfd

+0

С iOS8 можно было просто активировать ограничения, а не добавлять их в представления. Установите 'xConstraint.isActive = true' и' yConstraint.isActive = true'. – vacawama

ответ

1

Ограничения должны быть добавлены к самому раннему общему предку двух видов, на которые влияет ограничение. В этом случае self.view ранее был в иерархии, поэтому к нему должны быть добавлены ограничения, а не imageview.

С iOS 8 есть более простой способ. После того, как вы добавили свое представление в иерархию представлений (с помощью addSubview), вы можете активировать ограничения, а не добавлять их в представления.

Вы можете сделать это, установив isActive свойство верно:

xConstraint.isActive = true 
yConstraint.isActive = true 

или с помощью функции activate класса для NSLayoutConstraint активных нескольких ограничений:

NSLayoutConstraint.activate([xConstraint, yConstraint]) 

Как отметил @dfd в комментариях, вы также должны установить этот флаг:

imageview.translatesAutoresizingMaskIntoConstraints = false 

Это указывает iOS не создавать ограничения для imageview на основе его фрейма. Если вы этого не сделаете, вы столкнетесь с конфликтующими ограничениями.

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

+1

Спасибо @vacawama. Я установил свои ограничения немного по-другому (большинство из массивов, все с более сильным синтаксисом Swifty) и никогда не думали устанавливать isActive в true. Я каждый день узнаю что-то новое здесь, и сегодняшний урок завершен! – dfd