DatePickerAlert + DateFormat

This commit is contained in:
relikd
2020-06-11 01:32:50 +02:00
parent 946acc2460
commit 0a53898797
14 changed files with 195 additions and 72 deletions

View File

@@ -59,6 +59,7 @@ extension UIView {
private static let inverseItem: [NSLayoutConstraint.Attribute] = [.right, .bottom, .trailing, .lastBaseline, .rightMargin, .bottomMargin, .trailingMargin]
/// Create and active constraints for provided edges. Constraints will anchor the same edge on both `self` and `other`.
/// - Note: Will set `translatesAutoresizingMaskIntoConstraints = false`
/// - Parameters:
/// - edges: List of constraint attributes, e.g. `[.top, .bottom, .left, .right]`
/// - other: Instance to bind to, e.g. `UIView` or `UILayoutGuide`
@@ -66,7 +67,8 @@ extension UIView {
/// - rel: Constraint relation. (Default: `.equal`)
/// - Returns: List of created and active constraints
@discardableResult func anchor(_ edges: [NSLayoutConstraint.Attribute], to other: Any, margin: CGFloat = 0, if rel: NSLayoutConstraint.Relation = .equal) -> [NSLayoutConstraint] {
edges.map {
translatesAutoresizingMaskIntoConstraints = false
return edges.map {
let (A, B) = UIView.inverseItem.contains($0) ? (other, self) : (self, other)
return NSLayoutConstraint(item: A, attribute: $0, relatedBy: rel, toItem: B, attribute: $0, multiplier: 1, constant: margin).on()
}

View File

@@ -0,0 +1,34 @@
import UIKit
extension UIFont {
func withTraits(traits: UIFontDescriptor.SymbolicTraits) -> UIFont {
UIFont(descriptor: fontDescriptor.withSymbolicTraits(traits)!, size: 0) // keep size as is
}
func bold() -> UIFont { withTraits(traits: .traitBold) }
func italic() -> UIFont { withTraits(traits: .traitItalic) }
func monoSpace() -> UIFont {
let traits = fontDescriptor.object(forKey: .traits) as? [UIFontDescriptor.TraitKey: Any] ?? [:]
let weight = (traits[.weight] as? CGFloat) ?? UIFont.Weight.regular.rawValue
return .monospacedDigitSystemFont(ofSize: pointSize, weight: .init(rawValue: weight))
}
}
extension NSMutableAttributedString {
static private var def: UIFont = .preferredFont(forTextStyle: .body)
func normal(_ str: String, _ style: UIFont.TextStyle = .body) -> Self { append(str, withFont: .preferredFont(forTextStyle: style)) }
func bold(_ str: String, _ style: UIFont.TextStyle = .body) -> Self { append(str, withFont: UIFont.preferredFont(forTextStyle: style).bold()) }
func italic(_ str: String, _ style: UIFont.TextStyle = .body) -> Self { append(str, withFont: UIFont.preferredFont(forTextStyle: style).italic()) }
func h1(_ str: String) -> Self { normal(str, .title1) }
func h2(_ str: String) -> Self { normal(str, .title2) }
func h3(_ str: String) -> Self { normal(str, .title3) }
private func append(_ str: String, withFont: UIFont) -> Self {
append(NSAttributedString(string: str, attributes: [
.font : withFont,
.foregroundColor : UIColor.sysFg
]))
return self
}
}

View File

@@ -1,7 +1,5 @@
import Foundation
private let dateTimeFormat = DateFormatter(withFormat: "yyyy-MM-dd HH:mm:ss")
extension DateFormatter {
convenience init(withFormat: String) {
self.init()
@@ -9,26 +7,18 @@ extension DateFormatter {
}
}
extension Timestamp {
/// Time string with format `yyyy-MM-dd HH:mm:ss`
func asDateTime() -> String {
dateTimeFormat.string(from: Date.init(timeIntervalSince1970: Double(self)))
}
extension Date {
/// Convert `Timestamp` to `Date`
func toDate() -> Date {
Date(timeIntervalSince1970: Double(self))
}
init(_ ts: Timestamp) { self.init(timeIntervalSince1970: Double(ts)) }
/// Convert `Date` to `Timestamp`
var timestamp: Timestamp { get { Timestamp(self.timeIntervalSince1970) } }
}
extension Timestamp {
/// Current time as `Timestamp` (second accuracy)
static func now() -> Timestamp {
Timestamp(Date().timeIntervalSince1970)
}
static func now() -> Timestamp { Date().timestamp }
/// Create `Timestamp` with `now() - minutes * 60`
static func past(minutes: Int) -> Timestamp {
now() - Timestamp(minutes * 60)
}
static func past(minutes: Int) -> Timestamp { now() - Timestamp(minutes * 60) }
}
extension Timer {
@@ -39,6 +29,24 @@ extension Timer {
}
}
// MARK: - DateFormat
enum DateFormat {
private static let _hms = DateFormatter(withFormat: "yyyy-MM-dd HH:mm:ss")
private static let _hm = DateFormatter(withFormat: "yyyy-MM-dd HH:mm")
/// Format: `yyyy-MM-dd HH:mm:ss`
static func seconds(_ date: Date) -> String { _hms.string(from: date) }
/// Format: `yyyy-MM-dd HH:mm:ss`
static func seconds(_ ts: Timestamp) -> String { _hms.string(from: Date(ts)) }
/// Format: `yyyy-MM-dd HH:mm`
static func minutes(_ date: Date) -> String { _hm.string(from: date) }
/// Format: `yyyy-MM-dd HH:mm`
static func minutes(_ ts: Timestamp) -> String { _hm.string(from: Date(ts)) }
}
// MARK: - TimeFormat
struct TimeFormat {