如何使 UITableView 不改变 imageView 的框架,或调整图像大小以填充框架大小?

Posted

技术标签:

【中文标题】如何使 UITableView 不改变 imageView 的框架,或调整图像大小以填充框架大小?【英文标题】:How to make UITableView not change imageView's frame, or resize the image to fill the frame size? 【发布时间】:2012-08-31 09:29:22 【问题描述】:

tableView:cellForRowAtIndexPath 中,我将imageView.image 设置为1x1 或60x60 占位符图像,而单元格的高度为300。我还将imageView.frame 设置为(0,0, 300, 300)

然后我调用一个方法downloadImageFromURL:andSetIntoCell,它立即添加一个UIActivityIndicatorView并将框架设置为(0,0, 300, 300)(下载是在一个线程中异步完成的,该方法不会等待下载而只是返回立即)。

但是,tableView:cellForRowAtIndexPath 返回单元格后,imageView.frame 被调整为垂直居中原始 60x60 大小的图像。如果该占位符图像是 800x800,它实际上工作正常:帧仍然是 (0,0,300,300) 并且图像被缩小,但是当图像是 60x60 时,帧实际上被调整为类似 (0,120, 60, 60),这没关系,因为占位符是透明的,但 UIActivityIndicatorView 被添加为 imageView 的子视图,因此被垂直向下推,高度为 300 并覆盖下一行的一部分。

有没有办法告诉UITableView不要更改imageView.frame,或者通过编程轻松地将图像调整为300x300(最好不要使用BitmapContext),或者告诉imageView缩放以填充框架?

我补充说:

cell.imageView.contentMode = UIViewContentModeScaleToFill;

设置imageView.frame后,如果我在UIView上绘图,这通常可以工作,但UITableView仍会显示原始的60x60大小,并调整imageView.frame使其垂直居中。

(我认为在这种情况下,我可以将UIActivityIndicatorView 设置为图像的大小:60x60,但应该是使用 1x1 透明占位符图像)

更新:顺便说一句,我什至补充了:

self.table.autoresizesSubviews = NO;
self.table.autoresizingMask = UIViewAutoresizingNone;

cell.autoresizesSubviews = NO;
cell.autoresizingMask = UIViewAutoresizingNone;

cell.imageView.autoresizesSubviews = NO;
cell.imageView.autoresizingMask = UIViewAutoresizingNone;

在返回单元格之前,也是一样的:imageView被重新定位和调整大小。

【问题讨论】:

我也面临同样的问题。你能解决这个问题吗,如果是,那么如何解决? 【参考方案1】:

单元格的图像视图的框架稍后不会改变。所以使用layoutSubviews,我解决这个问题如下:-

使用AFNetworking 的名为setImageWithURLRequest: 的方法设置图像我使用64*64 大小作为我的示例。您可以更改适用于您的表格视图的框架

NSURL *urlMapThumbnail = [NSURL URLWithString:@"https://maps.googleapis.com/maps/api/staticmap?zoom=8&size=65x65&maptype=roadmap&markers=color:red%7Clabel:S%7C28.5002761,77.08126909999999"];

__weak UITableViewCell *cellTemp = cell;
[cell.imageView setImageWithURLRequest:[NSURLRequest requestWithURL:urlMapThumbnail]
                      placeholderImage:[UIImage imageNamed:@"sotrelocation"]
                               success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                                   CGSize finalSize = CGSizeMake(64, 64);
                                   image = [UIImage imageWithImage:image scaledToSize:finalSize];
                                   cellTemp.imageView.image = image;
                                   [cellTemp layoutSubviews];
                                failure:nil];

//重新缩放图片大小的方法

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize 
    //UIGraphicsBeginImageContext(newSize);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

【讨论】:

以上是关于如何使 UITableView 不改变 imageView 的框架,或调整图像大小以填充框架大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何使UITableview中的DPFBannerView不滚动

iOS如何固定UITableView中cell.imageView.image的图片大小

[IOS开发教程] iOS如何固定UITableView中cell.imageView.image的图片大小

如何使 UITableView 水平和垂直滚动

如何使 UITableView 的部分标题居中

如何使 UITableView 内容围绕中心点滚动