2010-11-22 34 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時,原點爲(0,爲全屏大小的一半),這是正確的,因爲它與應用程序窗口本身有關。但是,放置在scrollView(如leftView)中的視圖初始化爲halfFrame,但在這種情況下,原點相對於scrollView,將其有效地放在屏幕上。設置原點爲(0,0)固定的:

的CGRect stencilFrame = CGRectMake(0,0,fullFrame.size.width,fullFrame.size.height/2);

0

contentSize必須包含滾動視圖內的視圖的矩形。也就是所有可滾動控件的總大小。 UIScrollView的框架決定需要多少滾動才能讓用戶瀏覽所有內容。

+0

恭敬地,我不確定我是否遵守。不是「可滾動控件的總大小」等於單個視圖的3 *幀寬度(因爲有3個視圖)? – 2010-11-23 03:50:50

0

如果您有導航欄或選項卡欄,則沒有「完整框架」可用。一般來說,使用[UIScreen mainScreen]作爲佈局信息的代碼可能是錯誤的。

此外,如果(例如)正在進行呼叫或啓用網絡共享,狀態欄可以更改大小。

相反,使用任何理智的價值爲全畫幅,並啓用自動尺寸:

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

... 

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin; 

編輯:您還可能需要繼承的UIScrollView和實施-setFrame:,使其還可以設置內容大小和-layoutSubviews做正確的佈局。

+0

我明白你對使用mainScreen框架大小的觀點。但是,這對於任何幀大小(我已經找到)都不起作用,即使使用自動識別掩碼。 – 2010-11-23 05:14:10