2017-08-11 51 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

相关问题