5

我有一个子类 UITableViewCell。

我需要动态更改 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

6 回答 6

5

好吧,在发布赏金几天后,我找到了答案,我希望有一天这会对某人有所帮助......

我不是 100% 确定为什么,但我试图做的事情根本无法完成:

如果您通过 Interface Builder 放置对象,则无法更改对象的框架。

为了做出我想做的改变,我只是在我的子类中以编程方式创建了这些对象,在“initWithCoder”中。

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

然后我可以更改“-(void)layoutSubviews”中的框架(但基本上是我想要的任何地方)

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

    ...
于 2012-10-30T14:26:42.033 回答
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)];
}

结果是什么?

于 2012-10-13T12:36:15.227 回答
2

如果 Autolayout 开启,您将无法编辑通过 xib 创建的 UI 对象的框架。有两种方法可以做到这一点:

  1. 禁用该 xib 的自动布局。

或者

  1. 为特定的 NSlayout 约束创建一个 IBOutlet 并相应地附加它并通过代码更新其常量属性值,并且不要忘记在实现 constarint 的对象上适当地调用layOutIfNeeded 或根据实现的superview。
于 2015-01-10T09:39:21.300 回答
1

添加一个子视图cell.Content并调整该子视图的大小,而不是内容本身。单元格将始终被拉伸以适合您的表格视图,因此您无法将其变小。
(当然要使单元格高度更小,只需应用tableView:heightForRowAtIndexPath:

于 2012-10-15T13:43:10.307 回答
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;
    }
于 2012-10-15T13:56:26.917 回答
1

您是否考虑过在您的自定义单元格(即 MessageCell)中覆盖该- (void) layoutSubviews方法并在其中布局您的内容?我认为这是放置布局更改代码最安全的地方,因为在其他地方它可能没有任何效果。不要忘记调用[super layoutSubviews];您的layoutSubviews.

考虑采用这种方法,让我们知道它是否适合您!但是您需要考虑这种方法对性能的影响,因为layoutSubviews每次表格滚动时都会调用。

编辑:

为了适应内部标签的正确框架尺寸,请layoutSubviews考虑使用- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode框架计算。

于 2012-10-15T14:17:45.403 回答