2012-02-26 9 views
1

私はいくつかの動的にサイズ変更するサブビューを含む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? 
} 

答えて

0

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

私は、view.frameを2回割り当て、新しい計算の間にサブレイアウトを使用してプロセスを傍受し、計算が依存している値の一部を変更する可能性があることに気付きました。

私は、計算をレイアウトから切り離し、計算中にメソッドを呼び出さないように助言することしかできませんでした。それに光を当てるには、欠落しているサンプルアプリケーションを削除するか、またはサブビューのフレーム原点サイズとスクロールビューのcontentOffsetを示すNSLogステートメントを自分で追加する必要があります。 私の経験では、scrollviewは正常に動作しているので、コード内にバグがあると思います。

関連する問題