2014-10-05 39 views
2

我儘快使用自動版式,出於某種原因,作爲表視圖負載:表格視圖單元僅自動版式時,離屏幕

  • 第一對夫婦表視圖在屏幕上的細胞都沒有奠定了 正確
  • 表視圖細胞關閉屏幕當滾動到被奠定了 正確
  • 但是當我滾動備份到沒有鋪設 出正確的原始表視圖細胞,一旦熄滅屏幕,然後回到屏幕上所有的突然 都奠定了正確

任何幫助,將不勝感激,謝謝!

的cellForRowAtIndexPath:

if ([model isKindOfClass:[FRSS self]]) { 
     FRSS *fDan = (FRSS *)model; 
     // configure cell 
     MRWebListTableViewCell *api1Cell = [tableView dequeueReusableCellWithIdentifier:@"YourAPI1Cell"]; 

     // RSS 
     NSString *title = [NSString stringWithFormat:@"%@", fDan.title]; 

     // Get string from XML 
     NSString *dateString = [self timeSincePublished:fDan.pubDate]; 

     // Get description without tags 
     NSString *description = [self removeHTMLTags:fDan.description]; 

     NSString *link = [NSString stringWithFormat:@"%@", fDan.link]; 

     api1Cell.labelHeadline.text = title; 
     api1Cell.labelDescription.text = description; 
     api1Cell.labelPublished.text = dateString; 

     // Top Image View 
     UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(15, 20, 50, 50)]; 
     imv.image=[UIImage imageNamed:@"e_r.png"]; 
     [api1Cell.contentView addSubview:imv]; 

     return api1Cell; 

UPDATE:有很多與自動版式問題,甚至嘗試了一堆不同的事情後。

這與heightForRowAtIndexPath有很大關係。最後需要通過將該函數添加到ViewController代碼中手動設置。手動將其設置爲比正常估計單元格大的任何單元格(即,如果它中有任何圖像)。

+0

我遇到一些奇怪的問題,在我的iOS 7/8的應用程序與新tableViewCells我在Xcode 6.創建我已經添加了一些更詳細的我的答案,如果它可以幫助你找到 – 2014-10-15 15:15:32

+0

又一個問題,我的更新回答 – 2014-10-16 08:51:20

回答

2

好像iOS 8的汽車電池高度不工作太清楚了。我在iOS 6/7中遇到了類似的問題,在更新到iOS 8後,它仍然有效。所以,也許你應該暫時去讀舊學校。

我這裏有我的代碼的一些例子:AutoLayout multiline UILabel cutting off some text

在這裏:AutoLayout uitableviewcell in landscape and on iPad calculating height based on portrait iPhone

長話短說前的iOS參與維持細胞的複製只是爲了計算裏面的tableView的高度8路:heightForRowAtIndexPath :。但是這對於處理多行UILabel來說還不夠。每次調用layoutSubviews時,我都必須繼承UILabel的子類來更新preferredMaxLayoutWidth。

preferredMaxLayoutWidth「修復」似乎是我失蹤的神奇祕密。一旦我做到了這一點,我的大部分細胞都可以完美運作

第二個問題,我只需要我正確設置內容壓縮抵抗和內容擁抱屬性,例如告訴標籤擁抱文本將意味着它不會擴大以填充將導致單元格的空白縮小。

一旦我做了這兩件事情,我的單元格現在可以處理任何字體大小,或任何數量的文本沒有任何凌亂的佈局代碼。學習了很多東西,但我認爲它最終得到了回報,因爲我的應用中有很多動態內容。

編輯

在我自己的幾個問題來與iOS 8之後,我加入一些更多的細節來解決這些非常奇怪的autoLayout錯誤。

使用我提到的代碼,當單元格「行高」未設置爲自定義時,它似乎不起作用。通過選擇單元格並單擊autoLayout選項卡(其中所有內容壓縮電阻設置等),可在IB中找到此設置。按複選框,它將填充臨時高度。

其次,在我的代碼中,我保留一個單元格的本地副本,然後在heightForRowAtIndexPath:方法中多次重複使用它。這似乎每次調用時都會增加單元格高度。我已經通過調用重新初始化的本地副本:

localCopy = [self.tableView dequeueReusableCellWithIdentifier:@"mycell"]; 

它出現的新的Xcode 6/iOS 8的變化非常多所以不向下兼容與iOS 7,它似乎是完全不同的管理。

希望這會有所幫助。

編輯2

閱讀這個問題後:iOS AutoLayout multi-line UILabel

我遇到的另一個問題與iOS 7/8的iOS支持自動佈局!我爲iOS 8壓倒layoutSubviews我還需要重寫setBounds以在調用超級後更新preferredMaxLayoutWidth。 WTF改變了蘋果!

由於iOS 7不能使用自動功能,因此如果您在多個設備上使用相同的UILabel,它只能使用1的寬度,這似乎是IB在preferredMaxLayoutWidth中設置的問題。因此,iOS 8平板電腦上的UITableViewCell將更大,因爲同一個單元需要iOS 8 iPhone上有2行。

+0

謝謝我要試試這個! – Realinstomp 2014-10-08 15:53:34

+0

@Reez幸運嗎? – 2014-10-14 08:19:06

+0

我只是在尋找iOS8的支持,這是否會削減你的一些答案呢?再次感謝西蒙! – Realinstomp 2014-10-17 23:51:52

3

看來,自我調整UITableView細胞仍然存在一些缺陷。

以下是我們正在使用的解決方法。 雖然我不知道確切的底層機制,但這是我們發現的最簡單的黑客攻擊。

@implemetation YourTableViewCell 

- (void)setFrame:(CGRect)frame { 
    if(frame.size.width != self.bounds.size.width) { 
     [super setFrame:frame]; 
     self.contentView.bounds = CGRectMake(0, 0, frame.size.width, frame.size.height); 
     [self.contentView layoutIfNeeded]; 
    } 
    else { 
     [super setFrame:frame]; 
    } 
} 

// .. any other methods 

@end 

如果您不能編輯UITableViewCell子類,試試這個在不是您UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier" forIndexPath:indexPath]; 

    // setup cell ... 

    CGSize sysSize = [cell.contentView systemLayoutSizeFittingSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)]; 
    cell.contentView.bounds = CGRectMake(0,0, sysSize.width, sysSize.height); 
    [cell.contentView layoutIfNeeded]; 
    return cell; 
} 

順便說一句,在你的代碼,這是一個問題。

// Top Image View 
    UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(15, 20, 50, 50)]; 
    imv.image=[UIImage imageNamed:@"e_r.png"]; 
    [api1Cell.contentView addSubview:imv]; 

你不應該創建/ addSubview在tableView:cellForRowAtIndexPath:一個View。你的NIB已經有UIImageView了,對嗎?使用它像:

api1Cell.topImageView.image = [UIImage imageNamed:@"e_r.png"]; 

如果圖像是動態的,最簡單的解決方法是使用圖書館一樣SDWebImage

#import <SDWebImage/UIImageView+WebCache.h> 

... 

    if ([model isKindOfClass:[FRSS self]]) { 
     FRSS *fDan = (FRSS *)model; 
     // configure cell 
     MRWebListTableViewCell *api1Cell = [tableView dequeueReusableCellWithIdentifier:@"YourAPI1Cell"]; 

     ... 

     // Top Image View 
     // for example: fDan.imageURL is a image URL string 
     [api1Cell.topImageView sd_setImageWithURL:[NSURLURLWithString: fDan.imageURL] 
           placeholderImage:[UIImage imageNamed: @"e_r.png"]]; 
+0

謝謝!我會盡力在我的代碼中獲得這個,並且還要感謝Image View上的提示! – Realinstomp 2014-10-08 15:55:17

+0

此外,我的圖像視圖不是一個靜態圖像,它是從API返回的任何圖像。你的建議仍然可以正常工作嗎? – Realinstomp 2014-10-08 16:07:01

1

我相信,如果您將子視圖添加到UITableViewCell並使用AutoLayout,由於自動調整大小,您將得到不希望的結果。嘗試在UITableViewCell的子視圖上調用setTranslatesAutoresizingMaskINtoConstraints: NO

+0

這僅僅是爲了iOS8嗎?希望是的,因爲我絕對只需要支持iOS8。謝謝!! – Realinstomp 2014-10-17 23:52:47

相關問題