Skip to content

Instantly share code, notes, and snippets.

@vialyx
Last active February 27, 2018 13:30
Show Gist options
  • Save vialyx/5735f15f3591cec96dd21438a34933f6 to your computer and use it in GitHub Desktop.
Save vialyx/5735f15f3591cec96dd21438a34933f6 to your computer and use it in GitHub Desktop.
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let nameLabel = UILabel()
nameLabel.frame = CGRect(x: 20, y: 20, width: 300, height: 20)
nameLabel.attributedText = boldRangeString()
view.addSubview(nameLabel)
let attachmentLabel = UILabel()
attachmentLabel.frame = CGRect(x: 20, y: 60, width: 300, height: 75)
attachmentLabel.attributedText = textAttachmentString()
attachmentLabel.textColor = .black
view.addSubview(attachmentLabel)
let htmlLabel = UILabel()
htmlLabel.numberOfLines = 0
htmlLabel.frame = CGRect(x: 20, y: 150, width: 300, height: 100)
htmlLabel.attributedText = htmlString()
htmlLabel.sizeToFit()
view.addSubview(htmlLabel)
self.view = view
}
private func boldRangeString() -> NSAttributedString {
let attributedString = NSMutableAttributedString(string: "import Foundation.NSAttributedString")
attributedString.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 18.0),
NSAttributedStringKey.foregroundColor: UIColor.purple], range: NSMakeRange(0, 6))
attributedString.addAttributes([NSAttributedStringKey.font: UIFont.italicSystemFont(ofSize: 18),
NSAttributedStringKey.foregroundColor: UIColor.red], range: NSMakeRange(7, attributedString.length - 7))
return attributedString
}
private func htmlString() -> NSAttributedString {
let base64String = """
<!DOCTYPE html>
<html>
<body>
<h2>Hello!</h2>
<h3>This is Maxim Vialyx</h3>
<h4>You've done it!</h4>
<h5>HTML in UILabel</h5>
<h6>Good!</h6>
</body>
</html>
"""
guard let data = base64String.data(using: String.Encoding.utf8) else { fatalError("incorrect base64String") }
let attributedString = try! NSAttributedString(data: data, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
return attributedString
}
private func textAttachmentString() -> NSAttributedString {
let base64String = "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"
guard let data = Data(base64Encoded: base64String) else { fatalError("incorrect base64String") }
let textAttachment = NSTextAttachment()
textAttachment.image = UIImage(data: data)
let attributedString = NSAttributedString(attachment: textAttachment)
return attributedString
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment