Swift中如何根据图片分辨率计算字体大小缩放比例?
解决方案
核心问题在于仅按宽度缩放无法适配不同宽高比的图片(比如竖屏长图和横屏宽图),以下是几种通用的适配方案:
1. 基于图片最短边的比例计算字号
以图片宽高中的较小值为基准,按固定比例设置字号,保证文字在任何比例的图片上视觉大小一致:
// 取图片宽高的最小值作为基准 let baseSize = min(image.size.width, image.size.height) // 字号设为基准尺寸的5%(比例可根据需求调整) let fontSize = baseSize * 0.05
2. 基于图片对角线长度计算字号
对角线能综合图片的宽高维度,适配所有比例的图片,字号相对图片整体的比例更均衡:
// 计算图片对角线长度 let diagonal = sqrt(pow(image.size.width, 2) + pow(image.size.height, 2)) // 字号设为对角线的3%(比例可按需调整) let fontSize = diagonal * 0.03
3. 自适应指定区域的字号(灵活排版)
如果需要文字适配某个固定区域(比如底部1/8的高度、左半边宽度),可以通过反向推导计算合适的字号:
func calculateAdaptiveFontSize(for text: String, targetWidth: CGFloat, maxHeight: CGFloat, fontName: String = "Helvetica Bold") -> CGFloat { var fontSize: CGFloat = 100 // 初始大字号 var font = UIFont(name: fontName, size: fontSize)! let attributes: [NSAttributedString.Key: Any] = [.font: font] // 循环调整字号,直到文字适配目标区域 while true { let textSize = text.boundingRect(with: CGSize(width: targetWidth, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size if textSize.height <= maxHeight || fontSize <= 1 { break } fontSize -= 1 font = UIFont(name: fontName, size: fontSize)! attributes[.font] = font } return fontSize } // 使用示例:让文字适配图片底部1/8高度、90%宽度的区域 let targetWidth = image.size.width * 0.9 let maxHeight = image.size.height * 0.125 let adaptiveFontSize = calculateAdaptiveFontSize(for: "123", targetWidth: targetWidth, maxHeight: maxHeight)
优化你的文字绘制代码
当前代码存在两个细节问题,建议修正:
- 生成图片时使用原图片的scale,避免模糊:
// 替换第三个参数为image.scale,而非固定1 UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
- 精准控制文字绘制位置(以居中为例):
// 先计算文字实际尺寸 let textSize = text.boundingRect(with: image.size, options: .usesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size // 计算居中位置 let drawPoint = CGPoint(x: (image.size.width - textSize.width)/2, y: (image.size.height - textSize.height)/2) // 使用draw(at:)而非draw(in:),避免文字拉伸 text.draw(at: drawPoint, withAttributes: textFontAttributes)
内容的提问来源于stack exchange,提问作者KimJitae
相关产品推荐
相关产品推荐

