2017-08-11 52 views
0

我並不十分確定爲什麼在某些情況下(例如當文本結束到其最大寬度時)boundingRect返回不正確的值。它在所有其他情況下工作正常。Swift boundingRect爲遊樂場和實際項目上的相同輸入返回不同的值

下面是例子。

func snap(_ x: CGFloat) -> CGFloat { 
    let scale = UIScreen.main.scale 
    return ceil(x * scale)/scale 
} 

func snap(_ point: CGPoint) -> CGPoint { 
    return CGPoint(x: snap(point.x), y: snap(point.y)) 
} 

func snap(_ size: CGSize) -> CGSize { 
    return CGSize(width: snap(size.width), height: snap(size.height)) 
} 

func snap(_ rect: CGRect) -> CGRect { 
    return CGRect(origin: snap(rect.origin), size: snap(rect.size)) 
} 


extension String { 
    func boundingRect(with size: CGSize, attributes: [String: AnyObject]) -> CGRect { 
    let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading] 
    let rect = self.boundingRect(with: size, options: options, attributes: attributes, context: nil) 
    return snap(rect) 
    } 

    func size(fits size: CGSize, font: UIFont, maximumNumberOfLines: Int = 0) -> CGSize { 
    let attributes = [NSFontAttributeName: font] 
    var size = self.boundingRect(with: size, attributes: attributes).size 
    if maximumNumberOfLines > 0 { 
     size.height = min(size.height, CGFloat(maximumNumberOfLines) * font.lineHeight) 
    } 
    return size 
    } 

    func width(with font: UIFont, maximumNumberOfLines: Int = 0) -> CGFloat { 
    let size = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) 
    return self.size(fits: size, font: font, maximumNumberOfLines: maximumNumberOfLines).width 
    } 

    func height(fits width: CGFloat, font: UIFont, maximumNumberOfLines: Int = 0) -> CGFloat { 
    let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) 
    return self.size(fits: size, font: font, maximumNumberOfLines: maximumNumberOfLines).height 
    } 

    func height(fits width: CGFloat, attributes: [String:AnyObject]) -> CGFloat { 
    let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) 
    return self.boundingRect(with: size, attributes: attributes).height 
    } 
} 

以上的擴展和方法,我跑在操場下面的代碼。

let str = "ありがとうございます。スマホ専用のページがなくても反映できるかはエンジンにご確認いたします。" 
let paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.lineBreakMode = .byWordWrapping 
paragraphStyle.alignment = .left 
let attributes = [ 
    NSFontAttributeName: UIFont.systemFont(ofSize: 15), 
    NSParagraphStyleAttributeName: paragraphStyle 
] 
let height = str.height(fits: 320, attributes: attributes) 
print("calculated height: ", height) 

和它返回54.

然而,當我在ViewController跑在簡單的項目相同的代碼(單視圖控制器,拷貝和上述粘貼到viewDidLoad:,它返回36(缺失一個線高度)。知道爲什麼這兩次與同一輸入不同的表現?

回答

0

我已經運行在多個模擬器代碼爲iOS 10.3,他們都給予我的54.0爲計算的高度值。

沒有指定WHI你正在使用的iOS版本,所以這可能很重要。

此外,打印在您的應用程序和您的遊樂場中使用的字體。對於UIFont.systemFont(ofSize:15),我在兩者中都得到.SFUIText。

+0

你在設備上試過了嗎?顯然它在我的設備上返回36 ..它似乎只發生在unicode語言 – REALFREE

+0

哦,順便說一句,你應該測試iPhone 7加大小 – REALFREE

+0

我也測試了模擬器iPhone 7加,我發現它看起來像字體大小變得不同於模擬器和日語字符的設備 – REALFREE

相關問題