From d7f067ef8f87f3708a82ee96419915098d462751 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 17 Nov 2022 14:31:45 -0600 Subject: [PATCH] refactored name of FontLabelAttribute/added UIView extension for anchors Signed-off-by: Matt Bruce --- VDS.xcodeproj/project.pbxproj | 24 +++- ...=> TypographicalStyleLabelAttribute.swift} | 7 +- VDS/Extensions/UIView.swift | 118 ++++++++++++++++++ 3 files changed, 142 insertions(+), 7 deletions(-) rename VDS/Components/Label/Attributes/{FontLabelAttribute.swift => TypographicalStyleLabelAttribute.swift} (95%) create mode 100644 VDS/Extensions/UIView.swift diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 089a1176..d17ca572 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 5F21D7BF28DCEB3D003E7CD6 /* Useable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F21D7BE28DCEB3D003E7CD6 /* Useable.swift */; }; 5FC35BE328D51405004EBEAC /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC35BE228D51405004EBEAC /* Button.swift */; }; + EA0FC2C62914222900DF80B4 /* ButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0FC2C52914222900DF80B4 /* ButtonGroup.swift */; }; EA1F266528B945070033E859 /* RadioSwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA1F266128B945070033E859 /* RadioSwatch.swift */; }; EA1F266628B945070033E859 /* RadioSwatchGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA1F266228B945070033E859 /* RadioSwatchGroup.swift */; }; EA336171288B19200071C351 /* VDS.docc in Sources */ = {isa = PBXBuildFile; fileRef = EA336170288B19200071C351 /* VDS.docc */; }; @@ -57,6 +58,7 @@ EAB1D2CF28ABEF2B00DAE764 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */; }; EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */; }; EAB1D2EA28AE84AA00DAE764 /* UIControlPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */; }; + EAB5FED429267EB300998C17 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB5FED329267EB300998C17 /* UIView.swift */; }; EAC9257D29119B5400091998 /* TextLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC9257C29119B5400091998 /* TextLink.swift */; }; EAC925832911B35400091998 /* TextLinkCaret.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC925822911B35300091998 /* TextLinkCaret.swift */; }; EAC925842911C63100091998 /* Colorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEDF28F49DB3003B3210 /* Colorable.swift */; }; @@ -70,7 +72,7 @@ EAF7F0A2289AFB3900B287F5 /* Errorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A1289AFB3900B287F5 /* Errorable.swift */; }; EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A3289B017C00B287F5 /* LabelAttributeModel.swift */; }; EAF7F0A6289B0CE000B287F5 /* Resetable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A5289B0CE000B287F5 /* Resetable.swift */; }; - EAF7F0AB289B13FD00B287F5 /* FontLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */; }; + EAF7F0AB289B13FD00B287F5 /* TypographicalStyleLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AA289B13FD00B287F5 /* TypographicalStyleLabelAttribute.swift */; }; EAF7F0AD289B142900B287F5 /* StrikeThroughLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */; }; EAF7F0AF289B144C00B287F5 /* UnderlineLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AE289B144C00B287F5 /* UnderlineLabelAttribute.swift */; }; EAF7F0B1289B177F00B287F5 /* ColorLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */; }; @@ -95,6 +97,7 @@ /* Begin PBXFileReference section */ 5F21D7BE28DCEB3D003E7CD6 /* Useable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Useable.swift; sourceTree = ""; }; 5FC35BE228D51405004EBEAC /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + EA0FC2C52914222900DF80B4 /* ButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonGroup.swift; sourceTree = ""; }; EA1F266128B945070033E859 /* RadioSwatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioSwatch.swift; sourceTree = ""; }; EA1F266228B945070033E859 /* RadioSwatchGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioSwatchGroup.swift; sourceTree = ""; }; EA33616C288B19200071C351 /* VDS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = VDS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -145,6 +148,7 @@ EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = ""; }; EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Publisher+Bind.swift"; sourceTree = ""; }; EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControlPublisher.swift; sourceTree = ""; }; + EAB5FED329267EB300998C17 /* UIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = ""; }; EAC9257C29119B5400091998 /* TextLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLink.swift; sourceTree = ""; }; EAC925822911B35300091998 /* TextLinkCaret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLinkCaret.swift; sourceTree = ""; }; EAC925872911C9DE00091998 /* TextEntryField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; @@ -157,7 +161,7 @@ EAF7F0A1289AFB3900B287F5 /* Errorable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errorable.swift; sourceTree = ""; }; EAF7F0A3289B017C00B287F5 /* LabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeModel.swift; sourceTree = ""; }; EAF7F0A5289B0CE000B287F5 /* Resetable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Resetable.swift; sourceTree = ""; }; - EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontLabelAttribute.swift; sourceTree = ""; }; + EAF7F0AA289B13FD00B287F5 /* TypographicalStyleLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypographicalStyleLabelAttribute.swift; sourceTree = ""; }; EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrikeThroughLabelAttribute.swift; sourceTree = ""; }; EAF7F0AE289B144C00B287F5 /* UnderlineLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnderlineLabelAttribute.swift; sourceTree = ""; }; EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorLabelAttribute.swift; sourceTree = ""; }; @@ -202,6 +206,7 @@ EA0FC2BE2912D18200DF80B4 /* Buttons */ = { isa = PBXGroup; children = ( + EA0FC2C42914221800DF80B4 /* ButtonGroup */, 5FC35BE128D513EB004EBEAC /* Button */, EAC9257E29119B5D00091998 /* TextLink */, EAC925812911B34300091998 /* TextLinkCaret */, @@ -209,6 +214,14 @@ path = Buttons; sourceTree = ""; }; + EA0FC2C42914221800DF80B4 /* ButtonGroup */ = { + isa = PBXGroup; + children = ( + EA0FC2C52914222900DF80B4 /* ButtonGroup.swift */, + ); + path = ButtonGroup; + sourceTree = ""; + }; EA1F265F28B945070033E859 /* RadioSwatch */ = { isa = PBXGroup; children = ( @@ -306,6 +319,7 @@ EA33623D2892EE950071C351 /* UIDevice.swift */, EAF7F0B4289C126F00B287F5 /* UILabel.swift */, EAF7F0B6289C12A600B287F5 /* UITapGestureRecognizer.swift */, + EAB5FED329267EB300998C17 /* UIView.swift */, ); path = Extensions; sourceTree = ""; @@ -485,7 +499,7 @@ EA978EC4291D6AFE00ACC883 /* AnyLabelAttribute.swift */, EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */, EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */, - EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */, + EAF7F0AA289B13FD00B287F5 /* TypographicalStyleLabelAttribute.swift */, EAA5EEB428ECBFB4003B3210 /* ImageLabelAttribute.swift */, EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */, EAA5EEB628ECC03A003B3210 /* ToolTipLabelAttribute.swift */, @@ -647,6 +661,7 @@ EAC9258F2911C9DE00091998 /* EntryField.swift in Sources */, EAB1D2EA28AE84AA00DAE764 /* UIControlPublisher.swift in Sources */, EAF7F13328A2A16500B287F5 /* AttachmentLabelAttributeModel.swift in Sources */, + EA0FC2C62914222900DF80B4 /* ButtonGroup.swift in Sources */, EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */, EAD8D2C128BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift in Sources */, EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */, @@ -660,7 +675,7 @@ EA1F266528B945070033E859 /* RadioSwatch.swift in Sources */, EA4DB18528CA967F00103EE3 /* SelectorGroupHandlerBase.swift in Sources */, EA89200228AECF2A006B9984 /* UIButton+Publisher.swift in Sources */, - EAF7F0AB289B13FD00B287F5 /* FontLabelAttribute.swift in Sources */, + EAF7F0AB289B13FD00B287F5 /* TypographicalStyleLabelAttribute.swift in Sources */, EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */, EA336171288B19200071C351 /* VDS.docc in Sources */, EAA5EEB528ECBFB4003B3210 /* ImageLabelAttribute.swift in Sources */, @@ -669,6 +684,7 @@ EA3361B6288B2A410071C351 /* Control.swift in Sources */, 5F21D7BF28DCEB3D003E7CD6 /* Useable.swift in Sources */, EAF7F0B7289C12A600B287F5 /* UITapGestureRecognizer.swift in Sources */, + EAB5FED429267EB300998C17 /* UIView.swift in Sources */, EA3361AD288B26190071C351 /* DataTrackable.swift in Sources */, EA33623E2892EE950071C351 /* UIDevice.swift in Sources */, EA3362302891EB4A0071C351 /* Fonts.swift in Sources */, diff --git a/VDS/Components/Label/Attributes/FontLabelAttribute.swift b/VDS/Components/Label/Attributes/TypographicalStyleLabelAttribute.swift similarity index 95% rename from VDS/Components/Label/Attributes/FontLabelAttribute.swift rename to VDS/Components/Label/Attributes/TypographicalStyleLabelAttribute.swift index a1fc2ff2..fe923113 100644 --- a/VDS/Components/Label/Attributes/FontLabelAttribute.swift +++ b/VDS/Components/Label/Attributes/TypographicalStyleLabelAttribute.swift @@ -8,8 +8,9 @@ import Foundation import UIKit -public struct FontLabelAttribute: LabelAttributeModel { - public func isEqual(_ equatable: FontLabelAttribute) -> Bool { +public struct TypographicalStyleLabelAttribute: LabelAttributeModel { + + public func isEqual(_ equatable: TypographicalStyleLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range && color == equatable.color @@ -26,6 +27,7 @@ public struct FontLabelAttribute: LabelAttributeModel { public var color: UIColor public var textPosition: TextPosition public var lineBreakMode: NSLineBreakMode + //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- @@ -78,5 +80,4 @@ public struct FontLabelAttribute: LabelAttributeModel { attributedString.addAttribute(.paragraphStyle, value: paragraph, range: range) } } - } diff --git a/VDS/Extensions/UIView.swift b/VDS/Extensions/UIView.swift new file mode 100644 index 00000000..0214c67a --- /dev/null +++ b/VDS/Extensions/UIView.swift @@ -0,0 +1,118 @@ +// +// UIView.swift +// VDS +// +// Created by Matt Bruce on 11/17/22. +// + +import Foundation +import UIKit + +extension UIView { + public func pin(_ view: UIView, with edges: UIEdgeInsets = UIEdgeInsets.zero) { + leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: edges.left).isActive = true + trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -edges.right).isActive = true + topAnchor.constraint(equalTo: view.topAnchor, constant: edges.top).isActive = true + bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -edges.bottom).isActive = true + } + + public func pinToSuperView(_ edges: UIEdgeInsets = UIEdgeInsets.zero) { + if let superview { + pin(superview, with: edges) + } + } + + @discardableResult + public func height(_ constant: CGFloat) -> Self { + heightAnchor.constraint(equalToConstant: constant).isActive = true + return self + } + + @discardableResult + public func heightGreaterThanEqual(_ constant: CGFloat) -> Self { + heightAnchor.constraint(greaterThanOrEqualToConstant: constant).isActive = true + return self + } + + @discardableResult + public func heightLessThanEqual(_ constant: CGFloat) -> Self { + heightAnchor.constraint(lessThanOrEqualToConstant: constant).isActive = true + return self + } + + @discardableResult + public func width(_ constant: CGFloat) -> Self { + widthAnchor.constraint(equalToConstant: constant).isActive = true + return self + } + + + @discardableResult + public func widthGreaterThanEqual(_ constant: CGFloat) -> Self { + widthAnchor.constraint(greaterThanOrEqualToConstant: constant).isActive = true + return self + } + + @discardableResult + public func widthLessThanEqual(_ constant: CGFloat) -> Self { + widthAnchor.constraint(lessThanOrEqualToConstant: constant).isActive = true + return self + } + + @discardableResult + public func pinTop(_ constant: CGFloat = 0.0) -> Self { + return pinTop(nil, constant) + } + + @discardableResult + public func pinTop(_ anchor: NSLayoutYAxisAnchor? = nil, _ constant: CGFloat = 0.0) -> Self { + let found: NSLayoutYAxisAnchor? = anchor ?? superview?.topAnchor + if let found { + topAnchor.constraint(equalTo: found, constant: constant).isActive = true + } + return self + } + + @discardableResult + public func pinBottom(_ constant: CGFloat = 0.0) -> Self { + return pinBottom(nil, constant) + } + + @discardableResult + public func pinBottom(_ anchor: NSLayoutYAxisAnchor? = nil, _ constant: CGFloat = 0.0) -> Self { + let found: NSLayoutYAxisAnchor? = anchor ?? superview?.bottomAnchor + if let found { + bottomAnchor.constraint(equalTo: found, constant: -constant).isActive = true + } + return self + } + + @discardableResult + public func pinLeading(_ constant: CGFloat = 0.0) -> Self { + return pinLeading(nil, constant) + } + + @discardableResult + public func pinLeading(_ anchor: NSLayoutXAxisAnchor? = nil, _ constant: CGFloat = 0.0) -> Self { + let found: NSLayoutXAxisAnchor? = anchor ?? superview?.leadingAnchor + if let found { + leadingAnchor.constraint(equalTo: found, constant: constant).isActive = true + } + return self + } + + @discardableResult + public func pinTrailing(_ constant: CGFloat = 0.0) -> Self { + return pinTrailing(nil, constant) + } + + @discardableResult + public func pinTrailing(_ anchor: NSLayoutXAxisAnchor? = nil, _ constant: CGFloat = 0.0) -> Self { + let found: NSLayoutXAxisAnchor? = anchor ?? superview?.trailingAnchor + if let found { + trailingAnchor.constraint(equalTo: found, constant: -constant).isActive = true + } + return self + } + +}