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"]; 

ビューでDidLoad

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 に答える
1

cell.Contentコンテンツ自体ではなく、サブビューを追加して、そのサブビューのサイズを変更します。セルは常にテーブルビューに収まるように引き伸ばされるため、小さくすることはできません。
(もちろん、セルの高さを小さくするには、適用するだけですtableView:heightForRowAtIndexPath:

于 2012-10-15T13:43:10.307 に答える
1

- (void) layoutSubviewsカスタムセル(つまりMessageCell)のメソッドをオーバーライドして、そこにコンテンツをレイアウトすることを検討しましたか?他の場所では効果がない可能性があるため、これはレイアウト変更コードを配置するのに最も安全な場所だと思います。[super layoutSubviews];の実装を呼び出すことを忘れないでくださいlayoutSubviews

このアプローチを検討し、うまくいったかどうかをお知らせください。layoutSubviewsただし、テーブルがスクロールするたびに呼び出されるため、このアプローチではパフォーマンスへの影響を考慮する必要があります。

編集:

内部のラベルに適切なフレームサイズに対応するには、フレーム計算にlayoutSubviews使用することを検討してください。- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

于 2012-10-15T14:17:45.403 に答える
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 に答える