2016-07-31 5 views
0

Я хочу добавить UITextField в UITableCell и установить как ширину, так и высоту 100%;Быстрая ошибка при добавлении ограничений для UITextField с языком Visual Format

Мой быстры код:

nameTextField.translatesAutoresizingMaskIntoConstraints = false 

addSubview(nameTextField)  

let views = [ 
    "name" : nameTextField 
]; 

let widthLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[name]-|", options: [], metrics: nil, views: views) 
nameTextField.addConstraints(widthLayoutConstraint) 
let heightLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[name]-|", options: [], metrics: nil, views: views) 
nameTextField.addConstraints(heightLayoutConstraint) 

Я получил сообщение об ошибке, а последующие таблицы будет показывать:

2016-07-31 19:16:43.027 NOIB[40193:1889520] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x7ffbfa70f480 UITextField:0x7ffbfa41dff0.leading == NOIB.NameCell:0x7ffbfa41da10'NameCell'.leadingMargin> view:<UITextField: 0x7ffbfa41dff0; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7ffbfa41e5c0>>' 

ответ

2

Странно, что вы вызываете addSubview без указания вида. Обычно он используется как:

cell.contentView.addSubview(nameTextField) 

Поскольку вы не указываете вид, то он должен использовать self.

Два вида связаны с ограничениями, возвращаемыми вашим VFL: вашим nameTextField и его надзором. В VFL "|" представляет собой супервизор, поэтому он не должен быть явно включен в словарь view, который вы передаете. Вам нужно добавить ограничения в представление, которое выше в иерархии. В вашем случае вам нужно добавить ограничения на супервизор nameTextField, который равен self. Таким образом, вы, вероятно, могли бы сделать:

self.addConstraints(widthLayoutConstraint) 
self.addConstraints(heightLayoutConstraint) 

Начиная с iOS 8, есть более простой способ. Ограничения знают, какие представления они должны быть добавлены, поэтому вам просто нужно установить свои свойства active на true. VFL может возвращать несколько ограничений, поэтому вам нужно сделать все из них активными. Вы можете использовать метод класса activateConstraints от NSLayoutConstraint для активации нескольких ограничений:

let widthLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-[name]-|", options: [], metrics: nil, views: views) 
NSLayoutConstraint.activateConstraints(widthLayoutConstraint) 
let heightLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[name]-|", options: [], metrics: nil, views: views) 
NSLayoutConstraint.activateConstraints(heightLayoutConstraint)