缩放 UIImage 以适应 UIButton 的问题
Posted
技术标签:
【中文标题】缩放 UIImage 以适应 UIButton 的问题【英文标题】:Problems scaling a UIImage to fit a UIButton 【发布时间】:2012-07-05 13:37:42 【问题描述】:我有一组按钮和不同大小的图像。我想缩放每个图像,以便它以正确的纵横比适合按钮。缩放图像后,我将按钮的图像属性设置为缩放版本。
UIImage *scaledImage = [image scaledForButton:pickerButton];
[pickerButton setImage:scaledImage forState:UIControlStateNormal];
我的 scaledForButton 方法是在 UIImage 的类扩展中定义的。它看起来像这样:
- (UIImage *)scaledForButton:(UIButton *)button
// Check which dimension (width or height) to pay respect to and
// calculate the scale factor
CGFloat imageRatio = self.size.width / self.size.height;
CGFloat buttonRatio = button.frame.size.width / button.frame.size.height;
CGFloat scaleFactor = (imageRatio > buttonRatio ? self.size.width/button.frame.size.width : self.size.height/button.frame.size.height);
// Create image using scale factor
UIImage *scaledimage = [UIImage imageWithCGImage:[self CGImage]
scale:scaleFactor
orientation:UIImageOrientationUp];
return scaledimage;
当我在 iPad2 上运行它时,它工作正常并且图像缩放正确。但是,如果我在视网膜显示器(模拟器和设备上)上运行它,图像无法正确缩放并被挤压到按钮中。
任何想法为什么这只会发生在视网膜上?这几天我一直在挠头,但无法弄清楚。他们都运行相同的 ios,我检查了比例和比例输出,无论设备如何,它们总是相同的。非常感谢。
【问题讨论】:
它可能是 "CGFloat scaleFactor = (imageRatio > buttonRatio)? self.size.width/button.frame.size.width : self.size.height/button.frame.size.height; " 您在 iPad2 和新 iPad 中都记录了“buttonRatio”吗? 是的,我已经为这两种设备记录了它们,并且每次都相同。我使用 2x 图像进行视网膜显示。程序是否可能正在调整 1x 的大小,然后改用 2x? 你检查过CGImage的尺寸吗?视网膜情况下 CGImage 的尺寸将是非视网膜版本的两倍。 (或者不是?)但是 UI... 坐标中的 scaleFactor 总是相同的。 只是提供一个替代方案:我个人会使用 .contentMode 并将图像分配给按钮大小的临时图像视图。 contentMode 可能会因(imageRatio > buttonRatio)而异,但不一定会有所不同(我不太确定您想要实现什么)。然后确定图像视图的 .image 的大小并从那里开始。 【参考方案1】:在这里找到答案:UIButton doesn't listen to content mode setting?
如果您要设置 .contentMode,似乎您必须设置 UIButton 的 imageView 属性,而不仅仅是 UIButton,然后它才能正常工作。
iPad 3 上的问题正如 Herman 所建议的那样 - CGImage 仍然比 UIButton 大很多,因此即使按比例缩小,它仍然必须调整大小以适应按钮。
【讨论】:
以上是关于缩放 UIImage 以适应 UIButton 的问题的主要内容,如果未能解决你的问题,请参考以下文章
矩形图像缩放以适应正方形以与 MPMediaItemArtwork 一起使用
iOS - 如何正确缩放具有不同图像大小的 UIButton(如 Facebook 新闻提要)?