2014-12-29 68 views
0

我正在使用Autolayout在我的自定義UITableViewCell中使用水平分頁UIScrollView。我已成功將UIScrollView添加到具有所有適當約束的單元格中。 enter image description here使用Autolay在自定義UITableViewCell上使用Autolayout分頁UIScrollView

當我嘗試加載UIScrollView視圖時出現問題。我重寫了自定義單元格的layoutSubviews方法並在其中加載了ScrollView的視圖,因爲這是我能找到Autolayout的約束已加載的唯一方法。因此,給我精確的參考ScrollView的大小。

-(void)layoutSubviews { 

    [super layoutSubviews]; 

    for(int i=0; i<self.scrollArray.count; i++) { 
     CGRect frame; 
     CGFloat width = self.theScrollView.frame.size.width; 
     frame.origin.x = width * i; 
     frame.origin.y = 0; 
     frame.size = self.theScrollView.frame.size; 

     UIView *subview = [[UIView alloc] initWithFrame:frame]; 
     [subview addSubview:[self.scrollArray objectAtIndex:i]]; 
     [self.theScrollView addSubview:subview]; 
    } 

    CGSize contentSize = CGSizeMake(self.theScrollView.frame.size.width * self.scrollArray.count, self.theScrollView.frame.size.height); 
    self.theScrollView.contentSize = contentSize; 
    self.theScrollView.contentOffset = CGPointMake(0, 0); 
} 

然而,layoutSubviews叫我的細胞多次,從而增加了超過必要的子視圖我UIScrollView。有沒有更好的方法來加載我的子視圖,我不知道?或者有沒有辦法使用layoutSubviews但確保我的子視圖只加載UIScrollView一次?

+0

一個簡單的解決方案是存儲您在首次添加子視圖時設置的布爾屬性。如果此屬性在後續調用佈局子視圖時爲YES,則不要再次添加它們。或者將scrollview添加到單元格中,並通過屬性顯示它,然後在'cellForRowAtIndexPath'中添加子視圖。 – Paulw11

+0

@ Paulw11 - 感謝您的回覆。從我注意到的情況來看,約束只在最後一次調用'layoutSubviews'時設置,這意味着我需要一些方法來檢測最終調用,或者是否設置了約束。另外,我嘗試在'cellForRowAtIndexPath'中添加子視圖,並且還沒有設置約束。 – hgwhittle

+0

如果子視圖已經存在,那麼你仍然可以調用'layoutIfNeeded'和/或調整子視圖的大小,你只需要確保你只添加它們一次 – Paulw11

回答

1

將將子視圖添加到滾動視圖的部分移動到設置scrollArray的位置,並將子視圖添加到子視圖數組屬性。在layoutsubviews中,您應該只處理設置框架。

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // self.theScrollView.frame = Make sure you set the scroll view frame; 
    for(int i=0; i<self.scrollArray.count; i++) 
    { 
     UIView *aView = [self.scrollArray objectAtIndex:i]; 
     aView.frame = CGRectMake(self.theScrollView.frame.size.width * i, 0, self.theScrollView.frame.size.width, self.theScrollView.frame.size.height); 
    } 

    self.theScrollView.contentSize = CGSizeMake(self.theScrollView.frame.size.width * self.scrollArray.count, self.theScrollView.frame.size.height); 
    self.theScrollView.contentOffset = CGPointMake(0, 0); 

} 

- (void)partWhereYouSetScrollArray 
{ 
    for(int i=0; i<self.scrollArray.count; i++) 
    { 
     [self.theScrollView addSubview:[self.scrollArray objectAtIndex:i]]; 
    } 
} 

- (void)prepareForReuse 
{ 
    [super prepareForReuse]; 
    [[self.theScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    [self.scrollArray removeAllObjects]; 
} 
+0

感謝您的回覆。我認爲這是正確的。不幸的是'partWhereYouSetScrollArray'也會被多次調用。在帶有可重用單元格的tableView中,每次在'cellForRowAtIndexPath'中設置'scrollArray'時,都會調用該方法,從而導致我們遇到同樣的問題。 – hgwhittle

+0

我明白了。然後刪除prepareForReuse中的所有子視圖。 – HMHero

+0

我加了prepareForReuse。 – HMHero

相關問題