Размер содержимого UIScrollView отсекает подпредставления, когда это не должно

У меня есть UIScrollView, который содержит несколько подпредставлений с динамическим изменением размера. Я могу отлично изменять размер и компоновку подвидов, но когда я устанавливаю размер содержимого самого представления прокрутки, нижние подпредставления обрезаются. Есть ли какая-то причина, по которой высота размера содержимого представления прокрутки должна быть больше, чем сумма высот содержащихся в нем представлений?

Вот моя ситуация более подробно: у меня есть суперпредставление, содержащее UIScrollView, содержащее несколько подпредставлений. В методе layoutSubviews суперпредставления я рассчитал необходимый размер каждого подпредставления, затем установил фреймы так, чтобы подпредставления располагались вертикально вниз по экрану с небольшим пространством между ними. Когда закончите, я устанавливаю высоту размера содержимого UIScrollView в конец последнего подпредставления (origin.y + size.height). Теоретически это означает, что нижняя часть области содержимого представления прокрутки должна точно совпадать с нижней частью последнего подпредставления.

Но это не так. Вместо этого обрезается хороший кусок последнего подвида. Он все еще там - если я прокрутлю вниз, я увижу оставшуюся часть во время «отскока». Проблема еще хуже в ландшафтном режиме — гораздо большая часть нижнего подвида просто не видна.

Подвиды все организованы и расположены правильно. Проблема в том, что contentSize UIScrollView, по-видимому, должен быть значительно больше, чем сумма высот подпредставлений (плюс пространство между ними). Это не имеет для меня никакого смысла. Кроме того, размер «отключен» варьируется — я повторно использую это представление несколько раз с разными подпредставлениями, и все они отключены на разную величину. Поэтому простое добавление константы к высоте просмотра контента не поможет.

Из-за чего размер содержимого (или мои расчеты высоты) работают неправильно?

Код:

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGFloat width = self.bounds.size.width - [self subviewLeftMargin] - [self subviewRightMargin]; // All subviews have same width as parent view

    CGFloat x = [self subviewLeftMargin]; // All subviews should start at the far left of the view 
    CGFloat y = [self spaceBetweenSubviews]; // Running tally of the y coordinate for the next view

    /* Adjust the subviews */
    for(UIView *view in self.theVariousSubviews) {  
        /* Resize the view with the desired width, then let it size its height as needed */
        view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, width, view.frame.size.height);
        CGSize newSize = [view sizeThatFits:view.frame.size];

        /* Set the origin */
        //The subviews are positioned correctly, so this doesn't seem to be a problem
        view.frame = CGRectMake(x, y, newSize.width, newSize.height);

        /* Have the view refresh its own layout */
        [view setNeedsLayout];

        /* Update the y value for the next subview */
        y += newSize.height + [self spaceBetweenSubviews];
    }

    /* Resize the scroll view to ensure it fits all of the content */
    CGFloat scrollViewHeight = y;
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, scrollViewHeight);
    //Content size is set to the same total height of all subviews and spacing, yet it is too small. Why?
}

person Cellentel    schedule 26.02.2012    source источник


Ответы (1)


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

Что меня поражает, так это то, что вы назначаете view.frame дважды, и между новым расчетом вы перехватываете процесс с подмакетом, который может изменить некоторые значения, от которых зависит ваш расчет.

Я мог бы только посоветовать вам отделить расчет от компоновки и не вызывать методы во время расчета. Чтобы пролить свет на него, вы должны либо бросить образец приложения с отсутствующим вычислением, либо добавить для себя некоторый оператор NSLog, показывающий размер начала кадра любого подпредставления и contentOffset для прокрутки. По моему опыту, прокрутка в целом работает правильно, поэтому я ожидаю ошибки в вашем коде.

person iOS    schedule 26.02.2012