1

動的にサイズ変更するサブビューがいくつか含まれているUIScrollViewがあります。サブビューのサイズ変更とレイアウトは問題なく実行できますが、スクロールビュー自体のコンテンツサイズを設定すると、下部のサブビューがクリップされます。スクロールビューのコンテンツサイズの高さが、それに含まれるビューの高さの合計よりも大きくなければならない理由はありますか?

これが私の状況の詳細です。いくつかのサブビューを含むUIScrollViewを含むスーパービューがあります。スーパービューのlayoutSubviewsメソッドでは、各サブビューの必要なサイズを計算してから、サブビューが画面の下に少しスペースを空けて垂直に並べて表示されるようにフレームを設定しました。完了したら、UIScrollViewのコンテンツサイズの高さを最後のサブビューの終わりに設定しました(origin.y + size.height)。理論的には、これは、スクロールビューのコンテンツ領域の下部が最後のサブビューの下部と正確に一致する必要があることを意味します。

しかし、そうではありません。代わりに、最後のサブビューの素敵なチャンクがクリップされます。それはまだそこにあります-下にスクロールすると、「バウンス」中に残りの部分が表示されます。ランドスケープモードでは、問題はさらに悪化します。下部のサブビューのはるかに大きな部分が表示されないだけです。

サブビューはすべて適切に配置および配置されています。問題は、UIScrollViewのcontentSizeが、サブビューの高さの合計(およびサブビュー間のスペース)よりも大幅に大きくする必要があるように見えることです。これは私には意味がありません。さらに、サイズが「オフ」になる量はさまざまです。このビューをさまざまなサブビューで数回再利用すると、すべて異なる量でオフになります。したがって、コンテンツビューの高さに定数を追加するだけでは役に立ちません。

コンテンツサイズ(または高さの計算)が正しく機能しない原因は何ですか?

コード:

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

1 に答える 1

0

こんにちは、計算とサイズ変更のタイミングが間違っているようです。レイアウト変更のコードが欠落していないと、問題を完全に理解できませんでした。

私が驚くのは、view.frameを2回割り当てていることと、新しい計算の間に、計算が依存している値の一部を変更する可能性のあるサブレイアウトでプロセスをインターセプトすることです。

計算をレイアウトから分離し、計算中にメソッドを呼び出さないようにアドバイスすることしかできません。それに光を当てるには、計算が欠落しているサンプルアプリをドロップするか、サブビューのフレーム原点サイズとスクロールビューの contentOffset を示す NSLog ステートメントを自分で追加する必要があります。私の経験では、スクロールビューは一般的に適切に機能しているため、コード内にバグがあると予想されます。

于 2012-02-26T17:50:49.567 に答える