Не удается получить подкласс объекта из UIView () для правильного позиционирования в родительском представлении - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь разместить объект 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

Что дает?

1 Ответ

0 голосов
/ 02 февраля 2019

Добавьте эти две строки в код:

 square.widthAnchor.constraint(equalToConstant: 100).isActive = true
 square.heightAnchor.constraint(equalToConstant: 100).isActive = true
...