Есть ли способ сделать UIScrollView
автоматическую настройку высоты (или ширины) прокручиваемого контента?
Что-то вроде:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Есть ли способ сделать UIScrollView
автоматическую настройку высоты (или ширины) прокручиваемого контента?
Что-то вроде:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Лучший метод, с которым я когда-либо сталкивался, для обновления размера содержимого a UIScrollView
на основе содержащихся в нем подпредставлений:
Objective-C
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
стриж
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
viewDidLayoutSubviews
чтобы авторасстановка завершилась, в iOS7 это работало хорошо, но при тестировании ОС iOS6 автопрокладка по какой-то причине не завершила работу, поэтому у меня были неправильные значения высоты, поэтому я переключился наviewDidAppear
теперь работает нормально .. просто чтобы указать, может быть, это кому-то понадобится. спасибоUIScrollView не знает высоту своего содержимого автоматически. Вы должны сами рассчитать высоту и ширину
Сделайте это с чем-то вроде
Но это работает только в том случае, если виды расположены одно под другим. Если у вас есть виды рядом друг с другом, вам нужно только добавить высоту одного, если вы не хотите, чтобы содержимое скроллера было больше, чем оно есть на самом деле.
источник
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Решение, если вы используете автоматический макет:
Установите
translatesAutoresizingMaskIntoConstraints
дляNO
всех задействованных представлений.Разместите и измените размер прокрутки с ограничениями, внешними по отношению к прокрутке.
Используйте ограничения, чтобы расположить подвиды внутри представления прокрутки, будучи уверенными, что ограничения привязаны ко всем четырем краям представления прокрутки и не полагаются на представление прокрутки для получения их размера.
Источник: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
источник
Я добавил это в ответ Espuz и JCC. Он использует позицию y подвидов и не включает полосы прокрутки. Редактировать Использует нижнюю часть самого нижнего видимого подвида.
источник
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
в начале иself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
в конце метода?Вот быстрый ответ для тех, кому лень его преобразовать :)
источник
Вот адаптация Swift 3 ответа @leviatan:
РАСПРОСТРАНЕНИЕ
ИСПОЛЬЗОВАНИЕ
Очень прост в использовании!
источник
Следующее расширение было бы полезно в Swift .
Логика та же с данными ответами. Тем не менее, он пропускает скрытые представления внутри,
UIScrollView
и расчет выполняется после того, как индикаторы прокрутки скрыты.Кроме того, есть необязательный параметр функции, и вы можете добавить значение смещения, передав параметр функции.
источник
Отличное и лучшее решение от @leviathan. Просто перевод на быстрый, используя подход FP (функциональное программирование).
источник
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Вы можете получить высоту содержимого внутри UIScrollView, вычислив, какой дочерний элемент «достигает дальнейших». Чтобы рассчитать это, вы должны принять во внимание исходную точку Y (начало) и высоту элемента.
Поступая таким образом, элементы (подпредставления) не нужно располагать друг под другом.
источник
Я придумал другое решение, основанное на решении @ emenegro
По сути, мы выясняем, какой элемент находится дальше всего в представлении, и добавляем отступ в 10 пикселей внизу.
источник
Поскольку scrollView может иметь другие scrollView или другое дерево вложенных представлений inDepth, предпочтительнее выполнять глубинный рекурсивный запуск.
Swift 2
использование
источник
Или просто сделайте:
(Это решение было добавлено мной в качестве комментария на этой странице. Получив 19 голосов за этот комментарий, я решил добавить это решение в качестве официального ответа на благо сообщества!)
источник
Для swift4 с использованием reduce:
источник
Размер зависит от содержимого, загруженного в него, и параметров обрезки. Если это текстовое представление, то это также зависит от обтекания, количества строк текста, размера шрифта и т. Д. Для вас практически невозможно вычислить себя. Хорошая новость в том, что он вычисляется после загрузки представления и в viewWillAppear. До этого все неизвестно, а размер содержимого будет таким же, как и размер кадра. Но в методе viewWillAppear и после него (например, viewDidAppear) размер содержимого будет фактическим.
источник
Обернув код Ричи, я создал собственный класс UIScrollView, который полностью автоматизирует изменение размера содержимого!
SBScrollView.h
SBScrollView.m:
Как использовать:
просто импортируйте файл .h в контроллер представления и объявите экземпляр SBScrollView вместо обычного UIScrollView.
источник
Установите размер динамического содержимого следующим образом.
источник
это действительно зависит от содержимого: content.frame.height может дать вам то, что вы хотите? Зависит от того, является ли контент отдельной вещью или набором вещей.
источник
Я также нашел, что ответ левиафана работает лучше всего. Однако он рассчитывал странную высоту. При циклическом просмотре подпредставлений, если scrollview настроен на отображение индикаторов прокрутки, они будут в массиве подвидов. В этом случае решение состоит в том, чтобы временно отключить индикаторы прокрутки перед зацикливанием, а затем восстановить их предыдущую настройку видимости.
-(void)adjustContentSizeToFit
- это общедоступный метод в настраиваемом подклассе UIScrollView.источник
Я думаю, что это может быть изящным способом обновления размера представления содержимого UIScrollView.
источник
почему ни одной строчки кода ??
источник
источник