iOS-如何使用不同的图像大小(如Facebook新闻提要)正确缩放UIButton?

iOS-如何使用不同的图像大小(如Facebook新闻提要)正确缩放UIButton?,ios,image,uitableview,uibutton,scale,Ios,Image,Uitableview,Uibutton,Scale,我正在尝试为一个应用程序复制Facebook的新闻提要,并将有应该显示的图像。这些图像有多种尺寸,所以我应该如何适当地缩放它们以适应细胞而不显得怪异 该单元格包含一个UIButton,然后将图像设置为它。我正在使用一个按钮,因为我想在按下时打开全尺寸图像。如果用点击手势切换到UIImageView更好,我也可以这样做,只是觉得按钮更简单 想法 } 使用此选项可根据大小缩放图像。我假设您将使用UITableView来显示这些图像 这将在滚动表视图时产生问题,因为加载行时图像会调整大小,并且需要太多

我正在尝试为一个应用程序复制Facebook的新闻提要,并将有应该显示的图像。这些图像有多种尺寸,所以我应该如何适当地缩放它们以适应细胞而不显得怪异

该单元格包含一个UIButton,然后将图像设置为它。我正在使用一个按钮,因为我想在按下时打开全尺寸图像。如果用点击手势切换到UIImageView更好,我也可以这样做,只是觉得按钮更简单

想法

}


使用此选项可根据大小缩放图像。

我假设您将使用
UITableView
来显示这些图像

这将在滚动表视图时产生问题,因为加载行时图像会调整大小,并且需要太多的处理时间,从而导致滚动不平滑

有两种解决方法:

  • 创建全尺寸图像时,请创建大小适当的图像,并以这种方式将其保存到磁盘。如果这些是静态照片,那么您可以在图像编辑程序(即Photoshop)中创建缩略图,并将其与全分辨率照片一起包括在内。如果照片是动态下载/生成的,则在保存全尺寸图像时需要创建较小的版本。这实际上比听起来更复杂,如果这是您需要走的路线,我可以提供一些代码。关键的一点是,在加载tableview行时,您不需要调整图像的大小,从而节省了大量的时间

  • 在后台线程中调整图像大小,并在处理完成时将其添加到表视图行中。有很多这样做的例子,包括苹果公司的以下示例项目:


  • 最好的性能可能是两者兼有,但根据我的经验,实际上只需要其中之一。

    为什么不通过UIImageView的内置功能处理所有图像大小调整,然后在其上放置一个与它们大小(帧)相同的透明按钮。。。(*要使UIButton透明,只需清除背景色,并将按钮类型设置为自定义(我认为默认设置为圆角矩形或其他)


    另一方面,如果您只想检测在UIImageView上的点击,而不想在图像上放置透明的UIButton,只需使用TouchsBegind并检测触摸是否在阵列中的UIImage上。

    您可以在Quartz 2D framework中使用
    [CGAffineTransformMakeScale][1]
    轻松缩放视图

    #define X_SCALE_FACTOR 2.5
    #define Y_SCALE_FACTOR 2.5
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"myimage.png"]];
    imageView.transform = CGAffineTransformMakeScale(X_SCALE_FACTOR, Y_SCALE_FACTOR);
    

    你是真的在看Facebook的新闻提要,还是只是想要一些看起来相似的东西?不,不是在看Facebook的数据。只是模仿他们的新闻提要表来显示我自己的自定义数据。不过,我喜欢他们的“图像单元格”清理方式在允许点击图像以显示全尺寸图像的同时,我们也希望模拟这种情况。虽然这是一种简单的方法,但它存在一些潜在问题:1)无法保持图像的纵横比。2) 如果将生成的
    UIImage
    保存到磁盘(例如缓存缩略图),它将保存全分辨率图像,而不是缩放图像。请尝试中使用的方法。同时将插值级别设置为上下文。
    #define X_SCALE_FACTOR 2.5
    #define Y_SCALE_FACTOR 2.5
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"myimage.png"]];
    imageView.transform = CGAffineTransformMakeScale(X_SCALE_FACTOR, Y_SCALE_FACTOR);