Я пытаюсь разместить объект UISquare () , square
, в родительском представлении squareParentView
.Когда я пытаюсь добиться этого с помощью автоматической разметки, у меня ничего не получается.
Вот мой класс UISquare для справки:
class UISquare: UIView() {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
//.. setup the square. Implementation details are not relevant to this question ..
}
}
Вот мой ViewController class:
class viewController: UIViewController {
let square = UISquare(x: 100, y: 100, width: 100, height: 100)
let squareParentView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(squareParentView)
squareParentView.translatesAutoresizingMaskIntoConstraints = false
// Here I am simply making squareParentView the same size as self.view
squareParentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
squareParentView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
squareParentView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
squareParentView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
// Here I am setting up the square and enabling auto layout
squareParentView.addSubview(square)
square.translatesAutoresizingMaskIntoConstraints = false
// PROBLEM AREA RIGHT HERE
square.centerXAnchor.constraint(equalTo: squareParentView.centerXAnchor).isActive = true
square.centerYAnchor.constraint(equalTo: squareParentView.centerYAnchor).isActive = true
}
}
Когда я выполняю код, квадрат просто не появляется на экране .Это как если бы он полностью игнорировал автоматическое расположение и мои инструкции, чтобы его центр находился в центре родительского представления.
Если я избавлюсь от линий, в которых я установил ограничения квадрата (т.е. если я вообще не использую автоматическое расположение), квадрат появится в верхнем левом углу squareParentView, как и ожидалось.
Я подозреваю, что причина, по которой это не работает, заключается в том, что когда вы работаете с UIViews (такими как UISquare ), недостаточно просто изменить ограничения макета, а скорее кадр UIViewдолжен быть установлен в желаемое положение (т.е. в моем случае, установите square.center = squareParentView.center
).Однако, когда я его установил, заметной разницы нет.В любом случае, я не хочу смешивать автоматическое расположение с кадрами в моей кодовой базе, поэтому я хотел бы знать, есть ли способ центрировать этот квадрат в его родительском представлении, используя автоматическое расположение исключительно .
У меня также есть дополнительный вопрос:
Оператор печати в моем коде обнаруживает нечто довольно странное:
print(squareParentView.center) // prints (0,0)
Почему центр моего родительского представления установленв (0,0), когда я устанавливаю его ограничения программно, чтобы он заполнял self.view
?
т.е.
squareParentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
squareParentView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
squareParentView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
squareParentView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
Что дает?