Я заставил ваш пример работать.См. Встроенные комментарии для объяснений:
// Note: This frame will be ignored once translatesAutoresizingMaskIntoConstraint is set to false
let my1 = myview(frame: CGRect(x: 99, y: 99, width: 99, height: 99))
let my2 = myview(frame:CGRect(x: 50, y: 50, width: 50, height: 50))
my2.setcolor(color: #colorLiteral(red: 0.952941179275513, green: 0.686274528503418, blue: 0.133333340287209, alpha: 1.0))
my1.backgroundColor = UIColor.orange
// Use constraints, not frame for size of my1 and my2
my1.translatesAutoresizingMaskIntoConstraints = false
my2.translatesAutoresizingMaskIntoConstraints = false
// Frame not used, so set constraints for width and height of my1
let my1height = NSLayoutConstraint(item: my1, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 200)
let my1width = NSLayoutConstraint(item: my1, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 200)
// Frame not used, so set constraints for width and height of my2
let leadingheight = NSLayoutConstraint(item: my2, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 120)
let leadingwidth = NSLayoutConstraint(item: my2, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 60)
// Activate the constraints instead of adding them to a view
NSLayoutConstraint.activate([my1width, my1height, leadingheight, leadingwidth])
my1.addSubview(my2)
let cons2 = NSLayoutConstraint(item: my2, attribute: .left , relatedBy: .equal, toItem: my1, attribute: .left , multiplier: 1.0, constant: 20)
// This is how to activate a single constraint
cons2.isActive = true
my1
Примечания:
- Начиная с iOS 8, правильный способ включения ограничений - их активациявместо того, чтобы добавить их в представление.Активация их говорит iOS добавить их в правильные представления;если вы добавляете их в представления самостоятельно, вы должны быть осторожны, чтобы добавить их в правильные представления.Ваш
cons2
должен был быть добавлен к my1
, а не my2
, потому что ограничение включает my1
, и это родительский элемент my2
. - После того, как вы установите
translatesAutoresizingMaskIntoConstraints
в false
,frame
игнорируется, поэтому вам нужно убедиться, что у вас есть ограничения, чтобы полностью указать размер вашего представления. - Не вызывайте
updateConstraints
.Если что-то нужно, чтобы задействовать Auto Layout в действии на игровой площадке, вы можете позвонить layoutIfNeeded()
на ваш взгляд. - Примечание о стиле: Пусть Swift интерпретирует типыпеременных, когда это возможно.
- Не используйте
.init
.Способ Swift состоит в том, чтобы просто использовать имя класса / структуры.(например, NSLayoutConstraint(item:...)
вместо NSLayoutConstraint.init(item...)
)