Обычно, когда вы думаете об отношениях суперпредставления и подпредставления, можно ожидать, что исходная точка подпредставления будет содержаться в супервизии (обычно являющейся исходной точкой супервизора). Однако в UIKit
на iOS это не так. Почему исходная точка подпредставления (0,0) UIWindow
?
Чтобы продемонстрировать, следующий код создает два UIViews, одно из которых является подпредставлением другого. По какой-то причине исходная точка innerView
оказывается (0,0) всего UIWindow
. Я ожидал бы, что исходная точка innerView
будет исходной точкой outerView
(чья исходная точка продиктована центральной точкой его супервизора).
Что я получаю:
self.edgesForExtendedLayout = []
let superView = self.view!
superView.backgroundColor = .white
let outerView = UIView()
outerView.backgroundColor = .cyan
superView.addSubview(outerView)
outerView.snp.makeConstraints { make in
make.width.equalToSuperview().inset(20)
make.height.equalTo(superView.snp.height).dividedBy(3)
make.center.equalToSuperview()
}
let innerView = UIView()
innerView.backgroundColor = .purple
outerView.addSubview(innerView)
innerView.snp.makeConstraints { (make) in
make.height.width.equalToSuperview().dividedBy(2)
}
Чего я хочу:
Добавление дополнительной SnapKit
линии ограничения устанавливает innerView
исходную точку в исходную точку outerView
, но я считаю этот шаг лишним.
self.edgesForExtendedLayout = []
let superView = self.view!
superView.backgroundColor = .white
let outerView = UIView()
outerView.backgroundColor = .cyan
superView.addSubview(outerView)
outerView.snp.makeConstraints { make in
make.width.equalToSuperview().inset(20)
make.height.equalTo(superView.snp.height).dividedBy(3)
make.center.equalToSuperview()
}
let innerView = UIView()
innerView.backgroundColor = .purple
outerView.addSubview(innerView)
innerView.snp.makeConstraints { (make) in
make.top.left.equalToSuperview() // Set origins equal
make.height.width.equalToSuperview().dividedBy(2)
}
Вероятно, это фундаментальное непонимание иерархии представлений в iOS, поскольку до сих пор я полагался на раскадровки. Это моя первая попытка освоить программный интерфейс на iOS, поэтому я все еще пытаюсь осмыслить все нюансы. Прямо сейчас доказательства заставляют меня поверить, что каждое отдельное представление - независимо от того, где оно существует в иерархии представлений - начинается с позиции (0,0) ключа UIWindow
.
equalToSuperview()
в некоторых случаях, когда это имело бы смысл. Это было для моих целей тестирования, и я забыл вернуться. - person Nick Alexander   schedule 30.07.2017