92 lines
3.8 KiB
Swift
92 lines
3.8 KiB
Swift
//
|
||
// Copyright (c) 2020 Touch Instinct
|
||
//
|
||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
// of this software and associated documentation files (the Software), to deal
|
||
// in the Software without restriction, including without limitation the rights
|
||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
// copies of the Software, and to permit persons to whom the Software is
|
||
// furnished to do so, subject to the following conditions:
|
||
//
|
||
// The above copyright notice and this permission notice shall be included in
|
||
// all copies or substantial portions of the Software.
|
||
//
|
||
// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
// THE SOFTWARE.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
/// Enum that describes text with appearance options.
|
||
///
|
||
/// - string: Regular string with common and often-used text attributes.
|
||
/// - attributedString: Attributed string.
|
||
public enum ViewText {
|
||
|
||
case string(String, textAttributes: BaseTextAttributes)
|
||
case attributedString(NSAttributedString)
|
||
}
|
||
|
||
public extension ViewText {
|
||
|
||
/// Convenient initializer for .string case with default alignment parameter.
|
||
///
|
||
/// - Parameters:
|
||
/// - string: Text to use.
|
||
/// - font: Font to use.
|
||
/// - color: Color to use.
|
||
/// - alignment: Alignment to use. Default is natural.
|
||
init(string: String, font: UIFont, color: UIColor, alignment: NSTextAlignment = .natural) {
|
||
self = .string(string, textAttributes: BaseTextAttributes(font: font,
|
||
color: color,
|
||
alignment: alignment))
|
||
}
|
||
|
||
/// Attributed string created using text attributes.
|
||
var attributedString: NSAttributedString {
|
||
switch self {
|
||
case let .string(title, textAttributes):
|
||
|
||
let paragraphStyle = NSMutableParagraphStyle()
|
||
paragraphStyle.alignment = textAttributes.alignment
|
||
|
||
let attributes: [NSAttributedString.Key: Any] = [
|
||
.font: textAttributes.font,
|
||
.foregroundColor: textAttributes.color,
|
||
.paragraphStyle: paragraphStyle
|
||
]
|
||
|
||
return NSAttributedString(string: title, attributes: attributes)
|
||
|
||
case .attributedString(let attributedTitle):
|
||
return attributedTitle
|
||
}
|
||
}
|
||
|
||
/// Method that calculates size of view text using given max width and height arguments.
|
||
///
|
||
/// - Parameters:
|
||
/// - maxWidth: The width constraint to apply when computing the string’s bounding rectangle.
|
||
/// - maxHeight: The width constraint to apply when computing the string’s bounding rectangle.
|
||
/// - Returns: Returns the size required to draw the text.
|
||
func size(maxWidth: CGFloat = CGFloat.greatestFiniteMagnitude,
|
||
maxHeight: CGFloat = CGFloat.greatestFiniteMagnitude) -> CGSize {
|
||
|
||
return attributedString.boundingRect(with: CGSize(width: maxWidth, height: maxHeight),
|
||
options: [.usesLineFragmentOrigin, .usesFontLeading],
|
||
context: nil).size
|
||
}
|
||
|
||
/// Configures given ViewTextConfigurable instance.
|
||
///
|
||
/// - Parameter view: ViewTextConfigurable instance to configure with ViewText.
|
||
func configure(view: ViewTextConfigurable) {
|
||
view.configure(with: self)
|
||
}
|
||
}
|