Рассчитать размер прокрутки - PullRequest
7 голосов
/ 15 июня 2010

У меня есть скролл-просмотр в качестве подробного просмотра ячейки таблицы. В подробном представлении есть несколько представлений, таких как ярлыки, кнопки и т. Д., Которые я создаю через конструктор интерфейса. То, что я создаю через конструктор интерфейсов, статично. Я все ставлю на вид высоты 480.

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

Как установить высоту прокрутки при условии, что содержимое динамическое?

Ответы [ 7 ]

20 голосов
/ 20 июня 2010

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

    // Calculate scroll view size
float sizeOfContent = 0;
int i;
for (i = 0; i < [myScrollView.subviews count]; i++) {
    UIView *view =[myScrollView.subviews objectAtIndex:i];
    sizeOfContent += view.frame.size.height;
}

// Set content size for scroll view
myScrollView.contentSize = CGSizeMake(myScrollView.frame.size.width, sizeOfContent);

Я делаю это в методе viewWillAppear в контроллере для представления, содержащего представление прокрутки. Это последнее, что я делаю перед вызовом viewDidLoad на супер.

Надеюсь, это решит вашу проблему.

// Ханнес

8 голосов
/ 29 сентября 2010

Правильный, более короткий пример:

float hgt=0; for (UIView *view in scrollView1.subviews) hgt+=view.frame.size.height;

[scrollView1 setContentSize:CGSizeMake(scrollView1.frame.size.width,hgt)];

Обратите внимание, что это только суммы высот, например если есть два подпредставления бок о бок, их высоты будут добавлены к обоим, в результате чего сумма будет больше, чем должна быть. Кроме того, если между подпредставлениями есть вертикальные промежутки, сумма будет меньше, чем должна быть. Неправильная высота сбивает с толку scrollRectToVisible, давая случайные позиции прокрутки:)

Этот цикл работает и проверен:

float thisy,maxy=0;for (UIView *view in scrollView1.subviews) {
    thisy=view.frame.origin.y+view.frame.size.height; maxy=(thisy>maxy) ? thisy : maxy;
}
1 голос
/ 07 марта 2012

Это зависит от типа контента, который вы собираетесь добавлять динамически. Допустим, у вас есть большие текстовые данные для отображения, затем используйте UITextView и, поскольку он является подклассом UIScrollView, вы можете получить setContentSize TextView при назначении текстового содержимого. Исходя из этого вы можете установить общий размер UIScrollView.

float yPoint = 0.0f; 
UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 320.0f, 400.0f)];

UITextView *calculatorTextView = [[UITextView alloc] init]; calculatorTextView.text = @"My looong content text ..... this has a dynamic content"; `


[calculatorTextView sizeToFit];


yPoint = yPoint + calculatorTextView.contentSize.height; // Bingo, we have the new yPoint now to start the next component.

// Теперь вы знаете высоту вашего текста и где он закончится. Таким образом, вы можете создать Label или другой TextView и отображать там свой текст. Вы можете добавить эти компоненты в качестве подпредставления к просмотру прокрутки.

UITextView *myDisplayContent = [[UITextView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 300.f, calculatorTextView.contentSize.height)];

myDisplayContent.text = @"My lengthy text ....";
[myScrollView addSubview:myDisplayContent];

// В конце установите размер содержимого myScrollView равным общей длине области отображения.

[myScrollView setContentSize:yPoint + heightOfLastComponent];

Это работает для меня.

1 голос
/ 05 мая 2011

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

UIScrollView *scrollview = (UIScrollView *)[self.view viewWithTag:1];
UIView *longView = (UIView *)[self.view viewWithTag:2];
scrollview.contentSize = CGSizeMake(scrollView.frame.size.width, longView.frame.size.height);

Таким образом, longView знает, какой он высоты, и содержимое прокрутки просто установлено на совпадение.

0 голосов
/ 17 апреля 2019

У меня была такая же ситуация, но затем я написал новую версию в Swift 4, отражающую лучший ответ в Objective-C от Ханнеса Ларссона :

import UIKit

extension UIScrollView {
    func fitSizeOfContent() {
        let sumHeight = self.subviews.map({$0.frame.size.height}).reduce(0, {x, y in x + y})
        self.contentSize = CGSize(width: self.frame.width, height: sumHeight)
    }
}
0 голосов
/ 07 марта 2013
scrollView.contentSize = [scrollView sizeThatFits:scrollView.frame.size]

Полагаю, тоже будет работать

0 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...