iOS, высота содержимого контента scrollView равна высоте представления контента, но он все еще может прокручиваться вертикально?
[_contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(_scrollTabs);
make.height.mas_equalTo(_scrollTabs);
}];
[_scrollTabs mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
Я - это собственное представление. Я установил ограничения как это. Я делаю что-то неправильно? Спасибо!
1 ответ
Итог, если вы однозначно определите ограничения между представлением содержимого и представлением прокрутки (которое будет определять contentSize
в соответствии с TN2154), а затем однозначно определяют ограничения между представлением содержимого и его подпредставлениями, тогда да, он будет правильно определять размер представления прокрутки contentSize
,
Я бы предложил использовать отладчик вида, и посмотрите на ограничения в правой панели:
В конкретном снимке экрана я выбрал третье подпредставление (темно-синий) в представлении содержимого внутри представления прокрутки, и оно говорит нам, что активными ограничениями являются:
- смещение 10 от передней кромки контейнера (зеленый)
- смещение 10 от задней кромки контейнера (зеленый)
- смещение 10 от подпредставления выше (темно-красный)
- фиксированная высота 200 (я делаю это, потому что это не имеет неявной высоты)
- ширина основного вида (ярко-красный) меньше 20 (чтобы он занимал соответствующее количество горизонтального пространства, опять же, потому что неявной ширины нет)
- смещение 10 от подпредставления ниже (голубой)
Итак, вы просто нажимаете на различные подпредставления и контейнер и подтверждаете, что ограничения именно то, что вы и предполагали. Легко пропустить ограничение и / или не активировать его, и все это рушится.
Кстати, иногда неясно, между какими видами находятся ограничения, но если вы нажмете на кнопку ограничений, Когда выбран вид, он будет выделять только те виды, на которые у вас есть ограничения (в данном примере, на представление с контентом, на подпредставления выше и ниже и на основной вид; поскольку ни представление с прокруткой (желтый), ни первое подпредставление (фиолетовое) имеет какие-либо ограничения для этого третьего подпредставления, поэтому вы просто видите их каркас, а не их содержимое):
Обратите внимание, что это пример, я думал, что я покажу вам ограничения, которые я использовал, чтобы автоматический макет мог правильно рассчитать contentSize
на основе представления контента и подпредставлений с полностью удовлетворенными, однозначными ограничениями:
let contentView = ContentView()
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.backgroundColor = randomColor()
scrollView.addSubview(contentView)
NSLayoutConstraint.activate([
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor)
])
var previousView: UIView?
for _ in 0 ..< 4 {
let subview = SomeSubview()
subview.translatesAutoresizingMaskIntoConstraints = false
subview.backgroundColor = self.randomColor()
contentView.addSubview(subview)
NSLayoutConstraint.activate([
subview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
subview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
subview.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -20),
subview.heightAnchor.constraint(equalToConstant: 200)
])
if previousView != nil {
subview.topAnchor.constraint(equalTo: previousView!.bottomAnchor, constant: 10).isActive = true
} else {
subview.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
}
previousView = subview
}
previousView?.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
Что удивляет меня в вашем примере, так это то, что вы устанавливаете оба edges
(который я предполагаю, устанавливает верхнюю, нижнюю, ведущую и конечную ограничения) и height
, Установка высоты просмотра содержимого не требуется. Вы можете просто определить края, и вы должны быть хорошими. Высота продиктована ограничениями его подпредставлений.
Если ваши подпредставления отображаются правильно, но ваш вид прокрутки contentSize
неправильно настроен, то виновником может быть отсутствие нижнего ограничения между последним подпредставлением и просмотром контента.
Если у вас все еще есть проблемы, я бы предложил вам создать упрощенный, но полный пример вашей проблемы. Код, которым вы поделились, недостаточен. Но мы не хотим видеть весь ваш код или ваш конкретный пользовательский интерфейс. Вместо этого создайте отдельный упрощенный пример, который демонстрирует проблему, которую вы описываете. Только если мы сможем воспроизвести вашу проблему, мы сможем помочь вам решить ее.