2014-06-08 10 views
24

pojawia się błąd ...NSString boundingRectWithSize: options: attributes: context: notable in Swift?

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

... gdy próbuję użyć ...

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 
    } 
} 

Czy NSString nie obsługuje tej metody już, czy jestem brudząc się na składnia?

+0

zobaczyć tutaj ten sam q robienie surowej, szybkiej drogi: [https://stackoverflow.com/questions/30450434/figure-out-size-of-uilabel-based-on-string-in-swift/30450559#30450559] (https: // stackoverflow .pl/pytania/30450434/rysunek-out-of-uilabel-based-on-string-in-swift/30450559 # 30450559) – zzycami

Odpowiedz

61

Inicjalizatorzy oczekują nazwanych argumentów.

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 
    } 
} 

Uwaga: String s mogą być oddane do 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 
    } 
} 

lub

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 
    } 
} 

-

AKTUALIZACJA

Dla Swift 4 składni

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 
    } 
} 
+0

Wielkie dzięki, Jeffery! Nauczyłem się mojej lekcji! – aleclarson

+0

po użyciu w ten sposób otrzymuję błąd czasu kompilacji - "UIFont nie ma elementu sizeOfString" – Nitesh

+0

@Nitesh Wygląda na to, że próbujesz wysłać 'sizeOfString' do obiektu' UIFont' (klasa). Ten nie będzie wiedział o nowej metodzie, ale jej instancje będą. Spróbuj wysłać metodę do instancji 'UIFont'. Metody klas mogą być zdefiniowane w rozszerzeniach zbyt btw., Ale do tego celu użyłbyś 'class fund ... '. – Patru

4

Ewentualnie mógłbyś wrzuci do 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 
} 
0

Można użyć objective-c pomostowego

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

najnowszy 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 
} 
+0

Zobacz moją odpowiedź na zaktualizowaną wersję tego. – user3246173

1

najnowszy 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 
    } 
}