added helpers methods to layoutconstrainable
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
742bae9169
commit
5fcc59d8af
@ -631,6 +631,130 @@ extension LayoutConstraintable {
|
|||||||
return centerYAnchor.constraint(greaterThanOrEqualTo: found, constant: -constant).with { $0.priority = priority; $0.isActive = true }
|
return centerYAnchor.constraint(greaterThanOrEqualTo: found, constant: -constant).with { $0.priority = priority; $0.isActive = true }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// alignment
|
||||||
|
public enum LayoutAlignment: String, CaseIterable {
|
||||||
|
case fill
|
||||||
|
case leading
|
||||||
|
case top
|
||||||
|
case center
|
||||||
|
case trailing
|
||||||
|
case bottom
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LayoutDistribution: String, CaseIterable {
|
||||||
|
case fill
|
||||||
|
case fillProportionally
|
||||||
|
}
|
||||||
|
|
||||||
|
extension LayoutConstraintable {
|
||||||
|
public func removeConstraints() {
|
||||||
|
guard let view = self as? UIView, let superview = view.superview else { return }
|
||||||
|
|
||||||
|
// Remove all existing constraints on the containerView
|
||||||
|
let superviewConstraints = superview.constraints
|
||||||
|
for constraint in superviewConstraints {
|
||||||
|
if constraint.firstItem as? UIView == view
|
||||||
|
|| constraint.secondItem as? UIView == view {
|
||||||
|
superview.removeConstraint(constraint)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func applyAlignment(_ alignment: LayoutAlignment, edges: UIEdgeInsets = UIEdgeInsets.zero) {
|
||||||
|
guard let superview = superview else { return }
|
||||||
|
|
||||||
|
removeConstraints()
|
||||||
|
|
||||||
|
switch alignment {
|
||||||
|
case .fill:
|
||||||
|
pinToSuperView(edges)
|
||||||
|
|
||||||
|
case .leading:
|
||||||
|
pinTop(edges.top)
|
||||||
|
pinLeading(edges.left)
|
||||||
|
pinTrailingLessThanOrEqualTo(anchor: superview.trailingAnchor, constant: edges.right)
|
||||||
|
pinBottom(edges.bottom)
|
||||||
|
|
||||||
|
case .trailing:
|
||||||
|
pinTop(edges.top)
|
||||||
|
pinLeadingGreaterThanOrEqualTo(anchor: superview.leadingAnchor, constant: edges.left)
|
||||||
|
pinTrailing(edges.right)
|
||||||
|
pinBottom(edges.bottom)
|
||||||
|
|
||||||
|
case .top:
|
||||||
|
pinTop(edges.top)
|
||||||
|
pinLeadingGreaterThanOrEqualTo(anchor: superview.leadingAnchor, constant: edges.left)
|
||||||
|
pinTrailingLessThanOrEqualTo(anchor: superview.trailingAnchor, constant: edges.right)
|
||||||
|
pinBottomLessThanOrEqualTo(anchor: superview.bottomAnchor, constant: edges.bottom)
|
||||||
|
|
||||||
|
case .bottom:
|
||||||
|
pinTopGreaterThanOrEqualTo(anchor: superview.topAnchor, constant: edges.top)
|
||||||
|
pinLeadingGreaterThanOrEqualTo(anchor: superview.leadingAnchor, constant: edges.left)
|
||||||
|
pinTrailingLessThanOrEqualTo(anchor: superview.trailingAnchor, constant: edges.right)
|
||||||
|
pinBottom(edges.bottom)
|
||||||
|
|
||||||
|
case .center:
|
||||||
|
pinCenterX()
|
||||||
|
pinTop(edges.top)
|
||||||
|
pinLeadingGreaterThanOrEqualTo(anchor: superview.leadingAnchor, constant: edges.left)
|
||||||
|
pinTrailingLessThanOrEqualTo(anchor: superview.trailingAnchor, constant: edges.right)
|
||||||
|
pinBottom(edges.bottom)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method to check if the view is pinned to its superview
|
||||||
|
public func isPinnedToSuperview() -> Bool {
|
||||||
|
isPinnedVerticallyToSuperview() && isPinnedHorizontallyToSuperview()
|
||||||
|
}
|
||||||
|
|
||||||
|
public func isPinnedHorizontallyToSuperview() -> Bool {
|
||||||
|
guard let view = self as? UIView, let superview = view.superview else { return false }
|
||||||
|
let constraints = superview.constraints
|
||||||
|
var leadingPinned = false
|
||||||
|
var trailingPinned = false
|
||||||
|
|
||||||
|
for constraint in constraints {
|
||||||
|
if (constraint.firstItem as? UIView == view && constraint.firstAttribute == .leading && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .leading && constraint.relation == .equal && constraint.firstItem as? UIView == superview) ||
|
||||||
|
(constraint.firstItem as? UIView == view && constraint.firstAttribute == .left && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .left && constraint.relation == .equal && constraint.firstItem as? UIView == superview) {
|
||||||
|
leadingPinned = true
|
||||||
|
}
|
||||||
|
if (constraint.firstItem as? UIView == view && constraint.firstAttribute == .trailing && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .trailing && constraint.relation == .equal && constraint.firstItem as? UIView == superview) ||
|
||||||
|
(constraint.firstItem as? UIView == view && constraint.firstAttribute == .right && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .right && constraint.relation == .equal && constraint.firstItem as? UIView == superview) {
|
||||||
|
trailingPinned = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return leadingPinned && trailingPinned
|
||||||
|
}
|
||||||
|
|
||||||
|
public func isPinnedVerticallyToSuperview() -> Bool {
|
||||||
|
guard let view = self as? UIView, let superview = view.superview else { return false }
|
||||||
|
let constraints = superview.constraints
|
||||||
|
var topPinned = false
|
||||||
|
var bottomPinned = false
|
||||||
|
|
||||||
|
for constraint in constraints {
|
||||||
|
if (constraint.firstItem as? UIView == view && constraint.firstAttribute == .top && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .top && constraint.relation == .equal && constraint.firstItem as? UIView == superview) {
|
||||||
|
topPinned = true
|
||||||
|
}
|
||||||
|
if (constraint.firstItem as? UIView == view && constraint.firstAttribute == .bottom && constraint.relation == .equal && constraint.secondItem as? UIView == superview) ||
|
||||||
|
(constraint.secondItem as? UIView == view && constraint.secondAttribute == .bottom && constraint.relation == .equal && constraint.firstItem as? UIView == superview) {
|
||||||
|
bottomPinned = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return topPinned && bottomPinned
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Implementations
|
// MARK: - Implementations
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user