NSString boundingRectWithSize: options: attributes: context: не используется в Swift?
Я получаю ошибку...
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
этот метод больше, или я использую синтаксис?
Ответы
Ответ 1
Инициализаторы ожидают именованные аргументы.
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
может быть добавлено к 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
}
}
Ответ 2
В качестве альтернативы вы можете перевести его в 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
}
Ответ 3
Последний быстрый
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
}
Ответ 4
Последняя скорость:
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
}
}
Ответ 5
Вы можете использовать мост objective-c
let lblRegisterlinkWidth: CGFloat = lblRegisterLink.text!._bridgeToObjectiveC().boundingRectWithSize(lblRegisterLink.frame.size, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName : lblRegisterLink.font], context: nil).size.width
Ответ 6
Версия 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
}
}
Ответ 7
Последний Свифт 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
}
}
Ответ 8
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
}
}