私はいくつかの動的にサイズ変更するサブビューを含むUIScrollViewを持っています。私はサイズを変更することができ、サブビューをレイアウトすることはできますが、スクロールビュー自体のコンテンツサイズを設定すると、下位のサブビューがクリップされます。スクロールビューのコンテンツサイズの高さが、そのビューに含まれるビューの高さの合計よりも大きい必要がある理由はありますか?UIScrollViewコンテンツサイズの切り捨てサブビューがありません。
詳細は私の状況です: 私はいくつかのサブビューを含むUIScrollViewを含むsuperviewを持っています。スーパービューの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?
}