4

プレーンな古い UITableViewCell (グループ化されたスタイル) の左側にある UIImageView にマージンを適用したいと思います。

これを行うために私が見つけた唯一の方法は(hereを介して)、UIImageViewにアタッチする前にUIImage自体のサイズを変更することです。画像がセルより小さい場合、画像は中央に配置されます。副作用として必要なマージンを残します。

それは機能しますが、100単位の行の高さが iPhone4 では 100 ピクセルではなく 200 であるため画像がぼやけています。 . 醜いぼやけを入力してください。

私の質問は次のとおりです。画像を過度にダウンサンプリングせずに imageView の周りにマージンを達成するにはどうすればよいですか? (理想的には、ダウンサンプリングをまったく行わないでください - いずれにせよ、後で使用するためにオリジナルを保持する必要があります)。

明らかな何かが欠けているように感じます。これだけのためにカスタムセルクラスを実装したくありません。

4

4 に答える 4

3

みんなありがとう、私はサブクラス化を必要としない「解決策」を思いついた。

私がやっていることは、まだ画像をダウンサンプリングしていますが、2xサイズ(質問の例から180x180)にしています。次に、処理されたCGImageから最終的なUIImageを作成するときに、次を使用します。

UIImage: +(UIImage *)imageWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation

スケールを2に設定します。これですべてが機能します。しかし、UIKitを満足させるためだけに、まだ複製画像を作成しています。

于 2011-02-06T09:47:29.227 に答える
2

このメソッドを UITableViewCell サブクラスに実装します

-(void) layoutSubviews
{
    [super layoutSubviews];
    self.imageView.frame = CGRectInset(self.imageView.frame, 5, 5);
}
于 2013-01-13T10:52:07.000 に答える
0

私の場合、から継承された独自のサブクラスを使用しましたUITableViewCell。とても清潔で使いやすいです。また、さまざまなサイズの画像を使用して、このセルのサイズを適切に変更することもできます。ポイントは、通常の代わりに追加のプロパティを使用することですimageView

1:サブクラスに、のmainImageView代わりに使用できるプロパティを追加しましたimageView

@property (nonatomic, retain) UIImageView *mainImageView;

2:次に- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier。を割り当てて初期化しmainImageViewました。には任意のframe(rect)を設定できますmainImageView。にサブビューとして追加しcontentViewます。私はinsetImageViewそれを`contentView'の垂直方向の中央に揃えていました。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        // Initialization code.     
        mainImageView = [[UIImageView alloc] initWithFrame:frameCellMainImageView];
        [self.contentView addSubview:mainImageView];

                insetImageView = (sizeRowHeightTwoLinedDetail - frameCellMainImageView.size.height) / 2.0;

    }

    return self;
}

3:オーバーライド- (void)layoutSubviewsして、などの他のプロパティを確認し、追加されたプロパティでフレームが適切に配置されるようtextLabelに設定しますdetailTextLabelmainImageView

- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect frameImageView = frameCellMainImageView;
    frameImageView.origin.x = insetImageView;
    frameImageView.origin.y = insetImageView;

    [self.mainImageView setFrame:frameImageView];

    // Use changed frame
    frameImageView = self.mainImageView.frame;
    CGFloat newLeftInset = frameImageView.size.width + insetImageView;

    CGRect frameTextLabel = self.textLabel.frame;
    CGRect frameDetailLabel = self.detailTextLabel.frame;

    frameTextLabel.origin.x += newLeftInset;
    frameDetailLabel.origin.x += newLeftInset;

    CGFloat newTextWidth = 320.0;
    newTextWidth -= newLeftInset;
    newTextWidth -= insetImageView;
    newTextWidth -= insetImageView;

    frameTextLabel.size.width = newTextWidth;
    frameDetailLabel.size.width = newTextWidth;

    [self.textLabel setFrame:frameTextLabel];
    [self.detailTextLabel setFrame:frameDetailLabel];
}

UITableDataSourceDelegate4:メソッドでこのセルを使用cell.mainImageViewする場合、通常の代わりにメッセージの受信に使用しますcell.imageView

于 2011-02-05T23:58:38.010 に答える
0

注:私はこれをテストしていないのでUITableViewCell、これらの設定の一部をオーバーライドして、独自の内部ロジックに従ってサブビューを配置する可能性があります。

画像ビューのフレームを調整してみましたか? これを試して:

UITableViewCell * tableViewCell = [[[UITableViewCell alloc] init] autorelease];
tableViewCell.imageView.image = [UIImage imageNamed:@"table-view-image"];

CGRect imageViewFrame = tableViewCell.imageView.frame;
imageViewFrame.origin.x += 10.0f;
tableViewCell.imageView.frame = imageViewFrame;

xこれにより、画像ビューが通常の座標よりも 10 ポイント多くパディングされます。両側をパディングしたい場合はcontentMode、画像ビューのプロパティを設定しUIViewContentModeCenterて幅を調整することもできます:

UITableViewCell * tableViewCell = [[[UITableViewCell alloc] init] autorelease];
tableViewCell.imageView.image = [UIImage imageNamed:@"table-view-image"];
tableViewCell.imageView.contentMode = UIViewContentModeCenter;

CGRect imageViewFrame = tableViewCell.imageView.frame;
imageViewFrame.size.width += 20.0f;
tableViewCell.imageView.frame = imageViewFrame;

これにより、画像ビューが 20 ポイント広くなりますが、コンテンツ モードが中央に設定されているため、画像は引き伸ばされずに描画されます。画像の寸法が正しい場合、画像の左右に 10 ポイント効果的にパディングされます。UIImageただし、これを行う場合、提供する は、画像ビューに収まる正確な寸法である必要があることに注意する必要があります。contentModeのデフォルト設定はUIViewContentModeScaleToFillであるため、画像ビューのフレームに合わせて画像を自動的にスケーリングします。に設定するとUIViewContentModeCenter、これは行われなくなりますが、実際の画像が中央に配置されます。

于 2011-02-05T20:59:11.373 に答える