forked from Zero-zhou/iOS-Extensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUILabel+Ex.swift
123 lines (96 loc) · 4.75 KB
/
UILabel+Ex.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// UILabel+Ex.swift
//
// Created by Augus on 6/7/15.
// Copyright (c) 2015 Augus. All rights reserved.
//
import UIKit
// calculate size of UILabel with string
func ausFrameSizeForText(text: NSString, maximumSize: CGSize) -> CGRect {
let attrString = NSAttributedString(string: text as String)
return attrString.boundingRect(with: maximumSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil)
}
func ausFrameSizeForText(text: NSString, font: UIFont, maximumSize: CGSize) -> CGRect {
return text.boundingRect(with: maximumSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
}
func ausFrameSizeForText(label: UILabel, text: NSString, maximum: CGSize) -> CGRect {
label.attributedText = NSAttributedString(string: text as String)
let requireSize = label.sizeThatFits(maximum)
var labelFrame = label.frame
labelFrame.size.height = requireSize.height
label.frame = labelFrame
return label.frame
}
extension UILabel {
func isTruncated() -> Bool {
if let string = text {
let size = string.boundingRect(
with: CGSize(width: frame.size.width, height: CGFloat.greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [NSFontAttributeName: font],
context: nil).size
if size.height > bounds.size.height {
return true
}
}
return false
}
/**
Methods to allow using HTML code with CoreText
*/
func ausAttributedText(data: String) {
do {
let formatedData = (data as NSString).trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
let text = try NSAttributedString(data: formatedData.data(using: String.Encoding.unicode,allowLossyConversion: false)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
self.attributedText = text
}catch{
NSLog("something error with NSAttributedString")
}
}
func ausGetLabelSize() -> CGSize {
let constraint = CGSize(width: self.frame.width, height: CGFloat.greatestFiniteMagnitude)
let context = NSStringDrawingContext()
let boundingBox = self.text?.boundingRect(with: constraint, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: context).size
let size = CGSize(width: ceil(boundingBox!.width), height: ceil(boundingBox!.height))
return size
}
func ausGetLabelNumberOfLines() -> Int {
let textStorage = NSTextStorage(string: self.text!, attributes: [NSFontAttributeName: self.font])
let textContainer = NSTextContainer(size: self.ausGetLabelSize())
textContainer.lineBreakMode = .byWordWrapping
textContainer.maximumNumberOfLines = 0
textContainer.lineFragmentPadding = 0
let layoutManager = NSLayoutManager()
layoutManager.textStorage = textStorage
layoutManager.addTextContainer(textContainer)
var numberOfLines = 0
var index = 0
var lineRange : NSRange = NSMakeRange(0, 0)
while index < layoutManager.numberOfGlyphs {
numberOfLines += 1
layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
}
return max(numberOfLines - 1, 0)
}
func ausCalculateLabelSizeToFit() {
let constraint = CGSize(width: self.frame.width, height: CGFloat.greatestFiniteMagnitude)
let context = NSStringDrawingContext()
let boundingBox = self.text?.boundingRect(with: constraint, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: context).size
let size = CGSize(width: ceil(boundingBox!.width), height: ceil(boundingBox!.height))
var frame = self.frame
frame.size.height = size.height
self.frame = frame
}
func ausReturnFrameSizeAfterResizingLabel() -> CGSize {
let fixedWidth = self.frame.size.width
self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
let newSize = self.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
var newFrame = self.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
self.frame = newFrame
return self.frame.size
}
}