2012-02-26 111 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分配兩次,並且您在新的計算過程中截取了子過程,這可能會改變計算所依賴的某些值。

我只能建議你將計算與佈局分開,而不是在計算時調用方法。爲了給它帶來光明,你應該丟掉一個缺少計算的示例應用程序,或者爲自己添加一些NSLog語句,顯示任何子視圖的框架原點大小和滾動視圖的contentOffset。 根據我的經驗,scrollview在一般情況下工作正常,所以我期望在你的代碼中有一個bug。

相關問題