2013-10-16 209 views
5

我有一個iPhone應用程序,我在其中使用UITableView來格式化一組文本響應,每行一個。我已經在故事板中設置了一個單元格,並在其中放置了一個標籤,並設置了一個約束條件,說明標籤應距離單元格邊緣10個點。然後,我設置了一個自定義子類UITableViewCell,將故事板中的單元設置爲該類,並連接了插座。UITableViewCell內容左右移動

但是,當我加載表格時,在某些情況下,我看到單元格中的文本稍微向右移動:選擇單元格時,或者當我將其他單元格加載到表格中時。事實上,在後一種情況下,有時候一切都會轉移到右側,甚至已經在那裏的細胞!

這是怎麼回事?我在tableView:cellForRowAtIndexPath:中所做的唯一更改是標籤中的文字,我一直在設置它。我已經在故事板中的單元格上取消了「編輯時縮進」。

回答一些問題:我正在使用故事板設置視圖。 Xcode不報告任何約束條件的歧義。此外,這裏有截圖,前後:

enter image description here enter image description here

+2

你能告訴我們一些代碼..尤其是你設置nsconstraint的部分(你是以編程方式還是通過故事板設置它?) – abbood

+0

你還可以在移動之前和移動之後放置一些細胞外觀的截圖? – abbood

+0

是否有可能將問題視圖和視圖控制器分開,並將其放入新項目並共享其源代碼? –

回答

1

我的猜測是,該標籤的限制是不明確的。不明確的原因可能會導致UI組件跳來跳去。您可能需要爲標籤設置更多的約束來定義其在兩個軸上的位置。

或者,您可能需要做的只是在IB的編輯器菜單下將標籤設置爲「適合內容的尺寸」(內在內容尺寸)。

+0

Xcode沒有報告任何不明確的約束,也沒有得到任何有關約束的日誌消息,所以可能不是這樣。將標籤設置爲固有內容大小似乎沒有意義,因爲表中的每一行在標籤中都有不同的文本。 – dpassage

+0

Xcode不會自動報告模糊限制。你必須在你的視圖上調用hasAmbiguousLayout。 – bilobatum

+0

當標籤設置爲其固有內容大小時,會根據其內容大小(即文本大小)自動調整大小。 – bilobatum

-1

如果您有自定義子類UITableViewCell,請嘗試執行layoutSubviews。讓我從我的頭頂嘗試:

static CGFloat const kLeftMargin = 10.0f; 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    /* Prepare for processing */ 
    CGSize cellSize = self.bounds.size; 

    /* Change the textLabel frame */ 
    { 
    /* Compute the new label frame */ 
    CGSize labelSize = self.textLabel.bounds.size; 
    CGFloat xCoor = kLeftMargin; 
    CGFloat yCoor = roundf((cellSize.height - labelSize.height)/2.0f); 
    CGRect labelFrame = CGRectMake(xCoor, yCoor, 
            labelSize.width, labelSize.height); 

    /* Set the new label frame */ 
    self.textLabel.frame = labelFrame; 
    } 
} 

現在,這不是通常建議是什麼(因爲很多人用故事板和豆瓣),但是從經驗,如果你想要一些正確的布點完成,執行layoutSubviews

+0

有沒有人甚至在downvoting之前試過這個? –

1

您是否向UITableViewCell添加了新標籤,或者您是否使用了已存在的textLabel?如果添加了新的,請考慮將其刪除並改爲使用單元格的現有textLabel屬性。如果出於某種原因,這不是一個選項,請仔細檢查您添加的標籤是否位於單元格的contentView中,並且所有約束都是相對於父視圖而不是單元格本身。另外,爲了調試,您可以將單元格的contentView背景顏色設置爲紅色(cell.contentView.backgroundColor = [UIColor redColor];) - 這可以讓您更好地瞭解什麼是移動,標籤或整個視圖。

1

這只是一個猜測而沒有看到您的代碼。我曾經有過類似的問題,當應用程序重複使用現有的單元格時,標籤的尺寸不正確。所以,我必須在添加新標籤之前刪除我的cellForRowAtIndexPath方法中的舊標籤。以下是我刪除舊的一個:

UIView *oldLabel = [cell viewWithTag:3]; 
if (oldLabel != nil) 
{ 
    [oldLabel removeFromSuperview]; 
} 

然後我說像這樣的新標籤:

[cell.contentView addSubview:newLabelOrWhatever]; 
1

這可能是值得檢查,看看你的字符串內容不具有空間前綴上它。另外,您可以通過設置背景顏色來驗證標籤的實際位置。

0

我在選擇單元格時標籤會移動時遇到類似的問題。這是一個自定義的單元格,我從一個自定義的Nib加載。

在筆尖中,我沒有將UITableViewCell(超類)的backgroundView設置爲任何視圖。一旦我設置它(我將它設置爲ContentView),問題就會停止。

我的自動佈局約束看起來很好,沒有問題,所以我假設它是上面的修復它。