4

我想在普通的旧 UITableViewCell (分组样式)左侧的 UIImageView 上应用边距。

我发现这样做的唯一方法(通过这里)是在将 UIImage 附加到 UIImageView 之前调整它本身的大小。如果图像比单元格小,它将居中;留下所需的边距作为副作用。

好吧,这行得通,但现在我的图像很模糊,因为在 iPhone4 上 100单位的行高不是 100像素,而是200 像素。所以我最终得到了一个缩放到 90x90像素的 UIImage ,它产生了一个 90x90单位(180x180 像素)的 UIImageView 图像. 输入丑陋的模糊。

所以我的问题是:如何在不过度下采样图像的情况下在 imageView 周围实现边距?(理想情况下根本不需要下采样 - 我需要保留原件以备后用)。

我觉得我错过了一些明显的东西;我真的不想为此实现自定义单元类。

4

4 回答 4

3

谢谢大家,我想出了一个不需要子类化的“解决方案”。

我所做的仍然是对图像进行下采样,但缩小到 2 倍大小(问题示例中的 180x180)。然后,当我从处理过的 CGImage 创建最终的 UIImage 时,我使用:

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

并将 scale: 设置为 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会覆盖其中的一些设置,以根据它自己的内部逻辑布置它的子视图。

您是否尝试过仅调整图像视图的框架?试试这个:

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 回答
0

在我的例子中,我使用了我自己的继承自UITableViewCell. 它非常干净且易于使用。此外,我可以使用不同大小的图像来调整此单元格的大小。关键是使用将替换常规的附加属性imageView

1:在子类中,我添加了一个mainImageView可以用来代替imageView.

@property (nonatomic, retain) UIImageView *mainImageView;

2:然后在- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier. 我分配并初始化了mainImageView. 您可以为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以确保其他属性,例如textLabeldetailTextLabel将它们的框架设置为与添加的属性相得益彰mainImageView

- (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];
}

4:在UITableDataSourceDelegate方法中使用该单元格时,用于cell.mainImageView接收消息,而不是常规的cell.imageView

于 2011-02-05T23:58:38.010 回答