Подвид, который прикрепляется к родительскому представлению в Swift - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь добавить подпредставление, которое всегда будет иметь тот же размер, что и его родитель, чтобы оно всегда меняло размер при изменении размера родителя.

Я думал о добавлении (top, bottom, ведущие, конечные) ограничения из кода.

Когда я добавляю подпредставление, выполняется этот код:

subview.frame = parent.frame
subview.translatesAutoresizingMaskIntoConstraints = false
subview.leadingAnchor.constraint(equalTo: parent.leadingAnchor).isActive = true
subview.trailingAnchor.constraint(equalTo: parent.trailingAnchor).isActive = true
subview.topAnchor.constraint(equalTo: parent.topAnchor).isActive = true
subview.bottomAnchor.constraint(equalTo: parent.bottomAnchor).isActive = true

Но размер подпредставления остается равным 0 и отображается в левом верхнем углу экрана. Я не понимаю, почему его размер равен нулю, поскольку я установил его фрейм, а также потому, что он имеет все ограничения для установки его размера.

Представление инспектора:

Примечание. Родитель слева, подпредставление (LoaderView) справа

parent view subview

1 Ответ

1 голос
/ 20 апреля 2020

Ваш родительский вид выглядит как вид с прокруткой, и в нем отсутствуют ограничения, которые сообщают ему, каков его размер прокручиваемого содержимого (обратите внимание на предупреждение на первом скриншоте). Поскольку размер контента не определяет ничто, поэтому размер области прокрутки равен нулю.

Я не уверен, какие именно ограничения вам нужны, так как это зависит от деталей вашей ситуации, но для того, чтобы хотя бы увидеть ваше подпредставление вы можете добавить (например) ограничения равной ширины и равной высоты к вашему подпредставлению и его родительскому представлению (представление прокрутки):

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalTo: parent.heightAnchor)
])

Это определяет область прокрутки как равную по ширине и высота до рамки вида прокрутки. Однако, если вы сделаете это, то при попытке прокрутки за пределы области прокрутки (если она включена для этого вида прокрутки) действительно не будет никакой прокрутки, кроме прыгающего поведения.

Вы можете вместо этого измените привязку высоты, чтобы она была равна некоторой константе, просто чтобы обеспечить некоторую фактическую прокрутку:

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalToConstant: 2000) // just some arbitrary amount for demonstration purposes
])

Это делает высоту прокрутки равной 2000 точкам, независимо от высоты рамки представления прокрутки.

Или, если вы хотите, чтобы область прокрутки была кратна высоте кадра представления прокрутки, вы можете установить множитель для привязки высоты:

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalTo: parent.heightAnchor, multiplier: 3)
])

Это делает высоту прокрутки равной В три раза превышает высоту рамки вида с прокруткой.

И если вы хотите горизонтальную прокрутку, просто измените widthAnchor вместо heightAnchor, как я делал выше. Или, если вы хотите область с прокруткой 2D, которая позволяет перемещаться как по вертикали, так и по горизонтали, измените оба.

...