• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - Swift:如何计算居中字符串的大小

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:48:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我目前计算字符串的大小,如下所示。如何计算居中字符串?

func sizeOfString (string: String, constrainedToWidth width: Double, font: UIFont) -> CGSize {
    return (string as NSString).boundingRect(with: CGSize(width: width, height: Double.greatestFiniteMagnitude),
                                             options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                             attributes: [NSFontAttributeName: font],
                                             context: nil).size
}



Best Answer-推荐答案


你说:

Something else must be effecting the result because the string goes to 2 lines approximately two characters before it is calculated as doing so.

是的,如果你自己渲染 boundingRect 将捕获字符串的大小(例如使用 draw(in:withAttributes。但是 UILabel 可以想象做各种各样的其他事情(从边缘插入等)。

令我震惊的是,您有两个基本选择:

  1. 现在,您可以获取 Collection View 流布局的布局并将其 itemSize 设置为 UICollectionViewFlowLayoutAutomaticSize(在 iOS 10 及更高版本中):

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = UICollectionViewFlowLayoutAutomaticSize
    layout.estimatedItemSize = ...
    

    然后单元格将根据您在单元格中的自动布局约束自动调整大小(例如,标签的固定宽度,允许固有尺寸控制高度,也许尺寸 <= 一些最大尺寸)。

  2. 如果您想自己计算 boundingRect,那么您可能会使用 draw(in:withAttributes 自己渲染它,也避免了 UILabel 在幕后所做的任何特殊行为:

    let string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis leo convallis, euismod ipsum sed, lacinia diam. Nam sit amet justo id lacus blandit sodales id et."
    
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .byWordWrapping
    paragraphStyle.alignment = .center
    
    let attributes: [NSAttributedStringKey: Any] = [
        .font: font,
        .paragraphStyle: paragraphStyle
    ]
    
    let rect = string.boundingRect(with: CGSize(width: width, height: .greatestFiniteMagnitude),
                                   options: .usesLineFragmentOrigin,
                                   attributes: attributes,
                                   context: nil)
    
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
    string.draw(in: rect, withAttributes: attributes)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    

    然后您可以将 imagerect 用于 UIImageView

关于ios - Swift:如何计算居中字符串的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46453019/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap