【问题标题】:NSString boundingRectWithSize:options:attributes:context: not usable in Swift?NSString boundingRectWithSize:options:attributes:context: 不能在 Swift 中使用?
【发布时间】:2014-07-29 05:07:24
【问题描述】:

我得到了错误...

Could not find an overload for 'init' that accepts the supplied arguments

...当我尝试使用...

extension UIFont {
  func sizeOfString (string: String, constrainedToWidth width: Double) -> CGSize {
    NSString(string).boundingRectWithSize(CGSize(width, DBL_MAX),
                                          options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                                          attributes: [NSFontAttributeName: self],
                                          context: nil).size
  }
}

NSString 不再支持这种方法,还是我搞砸了语法?

【问题讨论】:

标签: swift


【解决方案1】:

斯威夫特 5

extension String {
    func sizeOfString(maxWidth: CGFloat, font: UIFont) -> CGSize {
        let tmp = NSMutableAttributedString(string: self, attributes:[NSAttributedString.Key.font: font])
        let limitSize = CGSize(width: maxWidth, height: CGFloat(MAXFLOAT))
        let contentSize = tmp.boundingRect(with: limitSize, options: .usesLineFragmentOrigin, context: nil)
        return contentSize.size
    }
}

【讨论】:

    【解决方案2】:

    最新的 Swift 5:

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

    【讨论】:

      【解决方案3】:

      Swift 4.1 版本

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

      【讨论】:

        【解决方案4】:

        初始化程序需要命名参数。

        extension UIFont {
            func sizeOfString (string: String, constrainedToWidth width: Double) -> CGSize {
                return NSString(string: string).boundingRectWithSize(CGSize(width: width, height: DBL_MAX),
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: [NSFontAttributeName: self],
                    context: nil).size
            }
        }
        

        注意:Strings 可以转换为 NSStrings。

        extension UIFont {
            func sizeOfString (string: String, constrainedToWidth width: Double) -> CGSize {
                return (string as NSString).boundingRectWithSize(CGSize(width: width, height: DBL_MAX),
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: [NSFontAttributeName: self],
                    context: nil).size
            }
        }
        

        extension UIFont {
            func sizeOfString (string: NSString, constrainedToWidth width: Double) -> CGSize {
                return string.boundingRectWithSize(CGSize(width: width, height: DBL_MAX),
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: [NSFontAttributeName: self],
                    context: nil).size
            }
        }
        

        --

        更新

        对于 Swift 4 语法

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

        【讨论】:

        • 像这样使用后出现编译时错误 - “UIFont 没有成员 sizeOfString”
        • @Nitesh 看起来您尝试将sizeOfString 发送到UIFont(类)对象。这个不会知道新方法,但它的实例会。尝试将方法发送到 UIFont 实例。顺便说一句,类方法也可以在扩展中定义,尽管您可以使用 class fund … 来做到这一点。
        • 对于任何复制粘贴,如果遇到pointSize]: unrecognized selector sent to instance这样的错误,那是因为您需要将[NSFontAttributeName: self]中的self替换为字体。
        【解决方案5】:

        最新的斯威夫特:

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

        【讨论】:

          【解决方案6】:

          最新的 Swift

          func sizeOfString (string: String, constrainedToHeight height: Double) -> CGSize {
              return NSString(string: string).boundingRect(with: CGSize(width: DBL_MAX, height: height),
                                                           options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                                           attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 20)],
                                                           context: nil).size
          }
          

          【讨论】:

            【解决方案7】:

            你可以使用objective-c桥接

            let lblRegisterlinkWidth: CGFloat = lblRegisterLink.text!._bridgeToObjectiveC().boundingRectWithSize(lblRegisterLink.frame.size, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName : lblRegisterLink.font], context: nil).size.width
            

            【讨论】:

              【解决方案8】:

              您也可以将其转换为 NSString

              if let ns_str:NSString = str as NSString? {
              
                 let sizeOfString = ns_str.boundingRectWithSize(
                                               CGSizeMake(self.titleLabel.frame.size.width, CGFloat.infinity), 
                                               options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
                                               attributes: [NSFontAttributeName: lbl.font], 
                                               context: nil).size
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-07-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-12-15
                • 2014-08-04
                相关资源
                最近更新 更多