UIScrollView отсечение размера контента подпредставлений, когда это не должно - PullRequest
1 голос
/ 26 февраля 2012

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

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

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

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

Что приводит к тому, что размер контента (или мои расчеты высоты) не работают правильно?

Код:

- (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?
}

1 Ответ

0 голосов
/ 26 февраля 2012

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

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

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

...