2012-10-13 31 views
5

我有一個子類UITableViewCell。無法更新UITableViewCell中的UI對象的框架

我需要動態更改UILabel的框架。

這裏是我做了什麼:

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

    cell.Content.Text = @"Content!"; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

中的UILabel的文本不改變,因此,這不是一個IBOutlet問題。 然而,框架與IB中定義的相同。

我做這樣的東西之前,所以我真的不知道哪裏出了問題在這裏...

感謝您的幫助。

編輯:

我用

[self.tableView registerNib:[UINib nibWithNibName:@"MessageCell" bundle:nil] 
    forCellReuseIdentifier:@"MessageCell"]; 

在viewDidLoad中

回答

4

好幾天,我希望這會幫助別人一天......

我不是100%肯定,爲什麼,但我試圖做的,根本不能被完成:

如果您已經通過Interface Builder進行了設置,則無法更改對象的框架。

爲了使我想要做的改變,我只是在我的子類,「initWithCoder」內編程創建這些對象。

content = [[UILabel alloc] initWithFrame:CGRectMake(120, 100, 200, 50)]; 
content.opaque = NO; 
content.numberOfLines = 0; 
[self.contentView addSubview:content]; 

當時我能夠改變框架內的「 - (空)layoutSubviews」(但基本上任何地方,我想)

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 

    ... 
2

肯定有什麼不對勁的地方。

嘗試,只是測試來實現這一點:

tableView:willDisplayCell:forRowAtIndexPath: 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MessageCell* aCell = (MessageCell*)cell; 
    aCell.Content.Text = @"Content!"; 
    [aCell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

有什麼結果呢?

+0

仍然是一樣的不幸... – BenB

+0

偉大的丹尼爾它爲我工作。 最後你給出了一個非常已知的問題的解決方案。 –

1

將子視圖添加到cell.Content並調整子視圖的大小而不是內容本身。單元格將始終被拉伸以適合您的表格視圖,因此您無法將其縮小。
(當然,使細胞高度更小,只適用於tableView:heightForRowAtIndexPath:

+0

我沒有嘗試編輯該單元格的視圖,而是在該單元格內的UILabel。 – BenB

1

可能是這與再利用細胞的事實有關。試試這個

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"messageCell"; 
     MessageCell *cell = (MessageCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    if(cell == nil) 
     { 
     cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]autorelease]; 
     } 
     cell.Content.Text = @"Content!"; 
     [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
     return cell; 
    } 
+0

該應用永遠不會到達(cell == nil)... – BenB

+0

您是否設置了tableview的數據源?你的意思是應用程序沒有達到(cell == nil),cellForRowAtIndexPath被調用? – Animesh

+0

我的意思是細胞永不爲零 – BenB

1

你考慮重寫- (void) layoutSubviews方法在您的自定義單元格(即MessageCell)和佈置你的東西在裏面?我認爲這是放置代碼的最安全的地方,因爲在其他地方它可能沒有任何作用。不要忘記在執行layoutSubviews時致電[super layoutSubviews];

考慮使用這種方法,讓我們知道它是否適合你! 但是您需要考慮這種方法的性能影響,因爲每次滾動表格時都會調用layoutSubviews

編輯:

,以適應正確的幀大小的標籤內layoutSubviews考慮使用- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode的框架計算。我已經找到了答案發布賞金後

+0

仍然沒有得到任何結果... 我確定在MessageCell中的重寫layoutSubviews被調用,並且我也稱爲超級函數 – BenB

+0

另一個非常尷尬的嘗試:重寫「 - (void)setFrame:(CGRect)frame」方法在你的MessageCell.m中(再次調用super)並在其中放置一條NSLog語句,以查看在表視圖重繪週期中何時調用它! –

+0

另一個關於我的初始答案的問題是:在你重寫的「layoutSubviews」方法中,你什麼時候調用「[super layoutSubviews]」?嘗試將呼叫超級後,您已爲您的標籤設置框架。 –

2

不能編輯通過廈門國際銀行創建的UI對象的框架,如果自動佈局打開。 有兩種方法可以做到這一點:

  1. 禁用該xib的Autolayout。

OR

  • 使一個IBOutlet特定NSlayout約束相應,將其固定,並通過碼更新其恆定屬性值,不要忘記適當地調用layOutIfNeeded在對象上根據實施情況實施constarint或superview。