我得到错误…
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
不再支持这个方法了吗,还是我在语法上搞砸了?
初始化器期望有命名参数。
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
}
}
注:String
s可铸为NSString
s
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
}
}
或者你可以将它转换成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
}
最新迅速
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
}
最新Swift:
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
}
}
你可以使用objective-c桥接
let lblRegisterlinkWidth: CGFloat = lblRegisterLink.text!._bridgeToObjectiveC().boundingRectWithSize(lblRegisterLink.frame.size, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName : lblRegisterLink.font], context: nil).size.width
迅速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
}
}
最新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
}
}
Swift 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
}
}