2013-02-21 123 views
18

我有一個自定義UITableViewCell子類,它已經在Interface Builder中應用了自動佈局約束。該單元格包含多個視圖,其中包括UITextField已出隊UITableViewCell佈局不正確,直到滾動(使用自動佈局)

相關地,UITextField的大小受到限制,使得其與下一個視圖之間存在默認水平間距。

小區被實例化等如下:

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

    cell.textField.text = @"Some string that is different for each cell"; 

    return cell; 
} 

當電池第一次出現,則UITextField超支正確的幀,並顯示UIView其右側的後面。但是,當我從屏幕上滾動單元格時,暫停,然後向後滾動,文本將被正確截斷。

下面顯示了一個示例(在第二次編輯時)。

我曾嘗試致電[cell setNeedsLayout][cell setNeedsDisplay]cellForRowAtIndexPath中的單元格,並在延遲後執行它們。兩者都不是有效的。

什麼是滾動屏幕,導致單元格顯示正確,我該如何複製或修復潛在問題?

編輯:

調用

[self.tableView reloadData]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

以便重新加載單元,會出現以使佈局出現正確的第一次。

但是,它現在休息(偶爾)在滾動(即滾動備份時,佈局約束現在不正確應用)。

調用[cell setNeedsLayout]cellForRowAtIndexPath似乎不能解決此問題。

EDIT2:

頂部電池,如圖here,正確顯示(作爲底電池那樣),直到我向下滾動屏幕。它消失了。

這反映了一個問題,因爲第一次編輯的 - 這是第二渲染。如果你的名字上的屬性,這是問題(讓我覺得它可能是與重用細胞?)

+0

您是否獲得有關在控制檯的約束任何警告,tableView.estimatedRowHeight採用低值降低了錯誤的發生

  • 示範,突出發生的呢? – rdelmar 2013-02-21 07:20:59

  • +0

    你可以包含一些截圖嗎? – jrturton 2013-02-21 08:06:30

    +0

    @rdelmar如果你感興趣,我寫了我的Autolayout類別(以前不曾討論過?):http://commandshift.co.uk/blog/2013/02/20/creating-individual-layout-constraints/ – jrturton 2013-02-21 08:08:58

    回答

    36

    UITableViewCell子類textLabeldefaultTextLabel,那麼IB將忽略您指定的約束並用默認約束覆蓋它們,而不會發出警告。

    甚至在IB中使用自定義樣式設計的單元格上也是如此,它沒有可見的textLabeldetailTextLabel屬性。

    如果在UITableViewCell子類中添加UIImageView類型屬性並將其命名爲imageView,也會發生這種情況。

    +4

    「imageView」屬性也是如此。 – RickiG 2013-08-28 08:46:45

    +4

    這個答案需要被提升到UITableViewCell類的引用中,我只是浪費了4個小時的生命。它的早晨4 ... – atreat 2013-11-16 09:01:33

    +0

    非常感謝。你剛剛救了我幾個小時的生命。 – 2014-04-22 12:38:43

    4

    根據這個multiple lines UILabel GitHub issue,這是一個持續不斷的iOS錯誤。

    我發現在iOS 9+中,這種情況大多發生在編輯模式下,具有很多不可預測性。

    以下解決方法僅部分起作用:它需要重繪兩次UITableView,但仍未涵蓋所有方案。

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.setNeedsLayout() 
        tableView.layoutIfNeeded() 
        tableView.reloadData() 
    } 
    

    注: