2010-11-22 8 views
1

私はUIViewを使ってビューのレイアウトをコントロールしています(ビューコントローラと一緒に)。私は、UIScrollViewが垂直画面の半分しか使用しないようにします。画面の上半分を使用するとうまく動作しますが、下半分は使用できません。UIScrollViewを含むUIViewのレイアウトを尊重する方法は?

ここでのUIViewControllerから該当するコードです:

- (void)loadView { 
CGRect fullFrame = [[UIScreen mainScreen] applicationFrame]; 
//trying to put the scroll view on the bottom half of the screen, but does not work. 
CGRect halfFrame = CGRectMake(0, fullFrame.size.height/2 , 
    fullFrame.size.width, fullFrame.size.height/2); 
//use this instead for the scroll view to go to the top half of the screen (and work properly) 
//CGRect halfFrame = CGRectMake(0, 0 , fullFrame.size.width, fullFrame.size.height/2); 

UIScrollView* sv = [[UIScrollView alloc] initWithFrame:halfFrame]; 
[sv setContentSize:CGSizeMake(3 * halfFrame.size.width, halfFrame.size.height)]; 

CGRect stencilFrame = halfFrame; 
UIView *leftView = [[UIView alloc] initWithFrame:stencilFrame]; 

stencilFrame.origin.x += stencilFrame.size.width; 
UIView *centerView = [[UIView alloc] initWithFrame:stencilFrame]; 

stencilFrame.origin.x += stencilFrame.size.width; 
UIView *rightView = [[UIView alloc] initWithFrame:stencilFrame]; 

//mix up the colors 
[leftView setBackgroundColor:[UIColor redColor]]; 
[centerView setBackgroundColor:[UIColor greenColor]]; 
[rightView setBackgroundColor:[UIColor blueColor]]; 

//add them to the scroll view 
[sv addSubview:leftView]; 
[sv addSubview:centerView]; 
[sv addSubview:rightView]; 

//turn on paging 
[sv setPagingEnabled:YES]; 

UIView *containerView = [[UIView alloc]initWithFrame:fullFrame]; 
[containerView addSubview:sv]; 
[self setView:containerView];  
} 

は、任意のアドバイスや助けを事前にありがとうございます。

答えて

1

私はそれを理解しました。問題の要点は、スクロールビュー内のビューが、スクロールビュー自体と同じフレームで初期化されることです。 scrollViewがhalfFrameで初期化されると、原点はアプリケーションウィンドウ自体に相対的なので、OKです(原点は全画面サイズの半分です)。ただし、scrollViewの内部に配置されたビュー(leftViewなど)はhalfFrameに初期化されますが、この場合、原点はscrollViewを基準にしており、効果的に画面外に配置されます。原点を(0,0)に設定すると、次のように修正されます。

CGRect stencilFrame = CGRectMake(0、0、fullFrame.size.width、fullFrame.size.width);

0

contentSizeは、スクロールビュー内にビューの矩形を含む必要があります。つまり、すべてのスクロール可能なコントロール内の合計サイズです。 UIScrollViewのフレームは、ユーザーがすべてをブラウズできるようにするために必要なスクロール量を決定します。

+0

確かに、私は私がフォローしているかどうかはわかりません。 "3つのビューがあるので、"個々のビューの3 *フレーム幅に等しい "内のスクロール可能なコントロールの合計サイズ"ですか? –

0

ナビゲーションバーまたはタブバーを使用している場合、「フルフレーム」は使用できません。一般に、レイアウト情報に[UIScreen mainScreen]を使用するコードはおそらく間違っています。

さらに、(たとえば)通話中またはテザリングが有効な場合、ステータスバーのサイズが変わることがあります。代わりに

、フルフレームのためにまともな値を使用して自動サイズ変更を有効にします。

CGRect fullFrame = {{0,0}, {320,480}}; 

... 

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin; 

EDIT:あなたはまた、おそらくUIScrollViewのをサブクラス化し、それも行うには、コンテンツのサイズと-layoutSubviewsを設定するよう-setFrame:を実装する必要があります正しいレイアウト。

+0

フレームサイズにmainScreenを使用することについてのあなたの点を理解しています。しかし、これは自動サイズ変更マスクであっても、(私が見つけた)フレームサイズでは機能しません。 –

+0

したがって、必要に応じてサブクラス化し、-layoutSubviewsを実装します。 –

+0

ありがとうございました。私は以下に投稿したより単純な解決策を見つけました。 –

関連する問題