2016-02-13 16 views
5

Theo chính thức docs, tôi đã tạo hàm này để tính chiều cao của văn bản.Chiều cao văn bản sai khi văn bản chứa biểu tượng cảm xúc

func calculateTextHeight(myString: String, myWidth: CGFloat, myFont: UIFont) -> CGFloat { 
    let textStorage = NSTextStorage(string: myString) 
    let textContainer = NSTextContainer(size: CGSize(width: myWidth, height: CGFloat.max)) 
    let layoutManager = NSLayoutManager() 

    layoutManager.addTextContainer(textContainer) 
    textStorage.addLayoutManager(layoutManager) 

    textStorage.addAttribute(NSFontAttributeName, value: myFont, range: NSMakeRange(0, textStorage.length)) 
    textContainer.lineFragmentPadding = 0 
    textContainer.lineBreakMode = .ByWordWrapping 

    layoutManager.glyphRangeForTextContainer(textContainer) 
    return layoutManager.usedRectForTextContainer(textContainer).size.height 
} 

Nhưng chiều cao được tính sai khi văn bản chứa biểu tượng cảm xúc.

var s = "ABCDE 12345" 
print(calculateTextHeight(s, myWidth: 500, myFont: UIFont.systemFontOfSize(14))) 
// prints 16.7 (correct) 

s = "ABCDE 12345 " 
print(calculateTextHeight(s, myWidth: 500, myFont: UIFont.systemFontOfSize(14))) 
// prints 22.9 (should be 16.7) 

Đây có phải là lỗi không? Làm thế nào tôi có thể sửa lỗi này?

+0

Mặc dù đây là câu hỏi nhưng nó đã giúp tôi. Cảm ơn –

Trả lời

0

Tôi đã sử dụng phương pháp thay thế để tính chiều cao của văn bản. Điều này làm việc với biểu tượng cảm xúc.

static func calculateStringHeight(str: String, maxWidth: CGFloat, font: UIFont) -> CGFloat { 
    return str.boundingRectWithSize(CGSizeMake(maxWidth, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).height 
} 
-1

Tôi không nghĩ đó là lỗi. Biểu tượng cảm xúc chiếm nhiều không gian hơn để hiển thị.

Tôi tin rằng điều này sẽ tạo sự khác biệt chỉ khi số lượng biểu tượng cảm xúc trong văn bản của bạn quá lớn. Nếu bạn thử mã dưới đây, tôi nghĩ rằng kết quả sẽ giống nhau.

s = "ABCDE 12345 " 
print(calculateTextHeight(s, myWidth: 500, myFont: UIFont.systemFontOfSize(14))) 
// prints 22.9 

Nếu bạn muốn loại bỏ biểu tượng cảm xúc, bạn có thể xóa chúng khỏi văn bản gốc trước khi thực hiện tính toán chiều cao. Trong trường hợp này, bạn cần phải quét văn bản gốc bằng cách thay thế tất cả các biểu tượng cảm xúc bằng ký tự khác và sau đó gọi phép tính chiều cao.

+0

Xóa biểu tượng cảm xúc trước khi tính toán chiều cao sẽ đánh bại mục đích của hàm do độ rộng cũng thay đổi. – Code

+0

Thay vào đó hãy loại bỏ sau đó, thay thế mỗi cái cho bất kỳ vi khuẩn nào. Tôi đoán rằng chiều cao sẽ rất gần. –

Các vấn đề liên quan