2011-09-27 69 views
2

我目前正在研究一個iPhone應用程序,它使用UITableView內的UIScrollView做了一些奇怪的事情。這是我第一次進入iPhone開發,所以我確信這是我失蹤的愚蠢。iPhone - Objective C - UITableView裏面的UIScrollView呈現有趣

在每個UITableViewCell中,我都放入一個基本的UITableViewCell。在那個UITableViewCell是一個標籤和一個UIScrollView。

標籤和滾動視圖設置並正常工作,但是當它第一次顯示時,它在y軸上向下偏移約30個像素,或者由XIB/NIB定位。我沒有手動移動它。標籤顯示在正確的位置。在0,0。 UIScrollView應該顯示在0,22,但顯示接近0,40。

當我滑動滾動包含UITableView,那麼所有的UIScrollViews將出現在正確的位置假設當UITableView滾動UITableViewCell離開屏幕。

下面是UITableView.cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"GalleryRowCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    [cell.layer setMasksToBounds:TRUE]; 
    [cell.layer setCornerRadius:10.0]; 


    Contagion *c = (Contagion *)[self.dataSet objectAtIndex:indexPath.row]; 
    GalleryRowViewController *subView = [[GalleryRowViewController alloc] initWithContagion:c]; 
    [cell.contentView addSubview:subView.view]; 
    subView.contagionName.text = c.name; 
    subView.contagion = c; 
    return cell; 
} 

這裏的代碼爲我GalleryRowViewController.viewDidLoad

- (void)viewDidLoad { 

[super viewDidLoad]; 

self.imageScroll.delegate = self; 

[self.imageScroll setBackgroundColor:[UIColor blackColor]]; 
[self.imageScroll setCanCancelContentTouches:NO]; 

self.imageScroll.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
self.imageScroll.clipsToBounds = NO; 
self.imageScroll.scrollEnabled = YES; 
self.imageScroll.pagingEnabled = NO; 

NSInteger x = 0; 
CGFloat xPos = 0; 
for (x=0;x<=10;x++) { 
    UIImage *image = [UIImage imageNamed:@"57-icon.png"]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    [imageView setBackgroundColor:[UIColor yellowColor]]; 

    CGRect rect = imageView.frame; 
    rect.size.height = 70; 
    rect.size.width = image.size.width; 
    rect.origin.x = xPos; 
    rect.origin.y = 5; 

    imageView.frame = rect; 

    [self.imageScroll addSubview:imageView]; 
    xPos += imageView.frame.size.width+5; 
} 

[self.imageScroll setContentSize:CGSizeMake(xPos, [self.imageScroll bounds].size.height)]; 

} 

---編輯影像---

代碼後應用程序載入:http://img809.imageshack.us/img809/4576/screenshot20110927at427.png

Scrollin後g屏幕和背面的行:http://img690.imageshack.us/img690/9461/screenshot20110927at428.png

回答

1

好吧,因爲我以前的回答太低了,讓我再試一次。

首先,我只注意到你使用每個單元的視圖控制器的核心問題。引用Apple的話,「」單個視圖控制器通常管理與單個屏幕的內容相關的視圖。「這也將擺脫你的XIB(只是手動配置你的滾動視圖),我敢打賭你會擺脫你的問題。

要繼續,您的主要選擇是否按照Scott的建議創建ContagionTableViewCell類。

如果是這樣,請遵循元素示例,創建具有scrollView,labelview和contagion屬性的UITableViewCell ContagionTableViewCell的子類。就像他們爲元素使用自定義設置器一樣,使用一個用於傳染,這樣只要它被分配,它也會更新單元格標籤(和相關圖片)。

將您的imageScroll代碼從GalleryRowViewController.viewDidLoad移動到ContagionTableViewCell init代碼中。將圖像代碼放入一個新的例程中,該例程將從傳染設置器中調用。

如果不是,則將GalleryRowView控制器代碼移動到您的UITableView中。我建議你看看蘋果的tableViewSuite中的cellForRowAtIndexPath,這是子視圖的第四個例子。特別是,它顯示了將單元格的創建(當您需要全新的單元格時)與配置單元格(當重用它時)之間的分離模式。由於您在scrollView中有10個imageView,因此您必須決定是否刪除所有這些(和/或滾動視圖),或者在單元格被重用時進入內部並更新其圖像。

+0

感謝您的回覆。你提出的幾乎是我最終解決這個問題的方法。它肯定與細胞再利用有關。 – erspies

+0

很高興我能幫到你 – mackworth

0

您可以發佈屏幕截圖。它很難想象你描述的是什麼。我不知道你是如何計算y的起源爲22.

作爲一個方面的說明,我相信它更清潔的做法是創建自己的TableViewCell子類並使用它來代替默認的UITableViewCell。有一個例子叫做Elements,它演示瞭如何正確地做到這一點:http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html

+0

它實際上不會讓我張貼圖像,我必須得到10個rep點。我可以在哪裏發郵件給他們?我沒有一個好地方公開轉儲它們。 – erspies

+0

@erspies - 你可以在網上主持 - imageshack或微型圖片 – Legolas

+0

添加圖像鏈接。 – erspies

0

嗯,我不知道這是你的問題的原因,但你肯定有問題。請注意,每次詢問單元格時,都會添加galleryRow子視圖。當一個單元格離開屏幕時,它被放置在可重用的CellCell隊列中。然後你被要求另一個單元格;你從隊列中得到它,它仍然有舊的galleryRow子視圖,現在你添加另一個;所以這不好。您應該重新使用或刪除舊的。

最後,爲什麼你使用UITableViewCellStyleSubtitle,然後不使用該UITableView中的任何默認字段?

+0

我正在使用UITableViewCellStyleSubtitle,因爲我不知道更好嗎?這是我第一次嘗試黑客應用程序,我擁有的只有Google。 – erspies