I hereby claim:
- I am rolandleth on github.
 - I am rolandleth (https://keybase.io/rolandleth) on keybase.
 - I have a public key whose fingerprint is BD89 9BE0 51C3 7C47 1B21 4C2C B2A2 A248 0058 1718
 
To claim this, I am signing this object:
| defaultBoldFontName | |
| defaultDimmedTextColor | |
| defaultEmphasizedFontName | |
| defaultFontName | |
| defaultSelectedTextShadowColor@1x | |
| defaultSelectedTextShadowColor@2x | |
| defaultShadowOffset | |
| defaultTextColor | |
| defaultTextShadowColor | |
| defaultTextShadowColor@2x | 
| import UIKit | |
| class VStack: UIStackView { | |
| init(alignment: UIStackView.Alignment = .fill, spacing: CGFloat = 10, _ arrangedViews: UIView...) { | |
| super.init(frame: .zero) | |
| axis = .vertical | |
| self.alignment = alignment | |
| self.spacing = spacing | 
| // Avoids the keyboard in a UIKit app by leveraging additionalSafeAreaInsets. | |
| // You can put this in the root view controller so the whole app will avoid the keyboard. | |
| // Only tested on iOS 13.3. | |
| // Made for https://douglashill.co/reading-app/ | |
| @objc func updateSafeAreaForKeyboardFromNotification(_ notification: Notification) { | |
| guard let endFrameInScreenCoords = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { | |
| return | |
| } | |
| // Please consider whether the force unwrap here is safe for your own use case. | 
| import UIKit | |
| import PlaygroundSupport | |
| let touchAnimationDuration: TimeInterval = 0.3 | |
| var shouldPulse = true | |
| class Handler { | |
| @objc | |
| func didTouchUpInside(_ button: UIButton) { | 
| // Blog post: https://rolandleth.com/extracting-and-parsing-tweets-from-your-twitter-archive | |
| import Foundation | |
| struct Tweet: Codable { | |
| let text: String | |
| let timestamp: String | |
| } | 
| import UIKit | |
| import PlaygroundSupport | |
| final class FullInteractiveLabel: UILabel { | |
| private let dataDetector: NSDataDetector? | |
| private var detectedResults: [NSTextCheckingResult] { | |
| guard let text = attributedText?.string ?? self.text else { return [] } | |
| return dataDetector?.matches(in: text, range: NSRange(location: 0, length: text.count)) ?? [] | 
I hereby claim:
To claim this, I am signing this object: