From 3ec2c984258b09d1e2552b238fb0323d364f4d58 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 31 Jul 2024 12:26:39 -0500 Subject: [PATCH] setup contentHugging and added more contraints to toggle when not in label mode Signed-off-by: Matt Bruce --- VDS/Components/Toggle/Toggle.swift | 61 +++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/VDS/Components/Toggle/Toggle.swift b/VDS/Components/Toggle/Toggle.swift index 7cb4ef71..c147739b 100644 --- a/VDS/Components/Toggle/Toggle.swift +++ b/VDS/Components/Toggle/Toggle.swift @@ -55,6 +55,7 @@ open class Toggle: Control, Changeable, FormFieldable { private var leftConstraints: [NSLayoutConstraint] = [] private var rightConstraints: [NSLayoutConstraint] = [] private var labelConstraints: [NSLayoutConstraint] = [] + private var toggleConstraints: [NSLayoutConstraint] = [] //-------------------------------------------------- // MARK: - Configuration @@ -95,7 +96,7 @@ open class Toggle: Control, Changeable, FormFieldable { open var toggleView = ToggleView().with { $0.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) $0.isUserInteractionEnabled = false - $0.isAccessibilityElement = false + $0.isAccessibilityElement = false } /// Used in showing the on/off text. @@ -148,18 +149,6 @@ open class Toggle: Control, Changeable, FormFieldable { open var value: AnyHashable? { isOn } - /// The natural size for the receiving view, considering only properties of the view itself. - open override var intrinsicContentSize: CGSize { - if showLabel { - label.sizeToFit() - let size = CGSize(width: label.frame.width + spacingBetween + toggleContainerSize.width, - height: max(toggleContainerSize.height, label.frame.height)) - return size - } else { - return toggleContainerSize - } - } - open override var shouldHighlight: Bool { false } //-------------------------------------------------- @@ -208,6 +197,49 @@ open class Toggle: Control, Changeable, FormFieldable { label.trailingAnchor.constraint(lessThanOrEqualTo: trailingAnchor) ] + // Set content hugging priority + setContentHuggingPriority(.required, for: .horizontal) + + isAccessibilityElement = true + if #available(iOS 17.0, *) { + accessibilityTraits = .toggleButton + } else { + accessibilityTraits = .button + } + addSubview(label) + addSubview(toggleView) + + // Set up initial constraints for label and switch + toggleView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + + //toggle + toggleConstraints = [ + toggleView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor), + toggleView.trailingAnchor.constraint(lessThanOrEqualTo: trailingAnchor) + ] + + //toggle and label variants + labelConstraints = [ + height(constant: toggleContainerSize.height, priority: .defaultLow), + heightGreaterThanEqualTo(constant: toggleContainerSize.height, priority: .defaultHigh), + label.topAnchor.constraint(equalTo: topAnchor), + label.bottomAnchor.constraint(equalTo: bottomAnchor), + ] + + //label-toggle + leftConstraints = [ + label.leadingAnchor.constraint(equalTo: leadingAnchor), + toggleView.leadingAnchor.constraint(equalTo: label.trailingAnchor, constant: spacingBetween), + toggleView.trailingAnchor.constraint(equalTo: trailingAnchor) + ] + + //toggle-label + rightConstraints = [ + toggleView.leadingAnchor.constraint(equalTo: leadingAnchor), + label.leadingAnchor.constraint(equalTo: toggleView.trailingAnchor, constant: spacingBetween), + label.trailingAnchor.constraint(equalTo: trailingAnchor) + ] + bridge_accessibilityValueBlock = { [weak self] in guard let self else { return "" } if showText { @@ -261,6 +293,8 @@ open class Toggle: Control, Changeable, FormFieldable { label.isHidden = !showLabel if showLabel { + NSLayoutConstraint.deactivate(toggleConstraints) + label.textAlignment = textPosition == .left ? .right : .left label.textStyle = textStyle label.text = statusText @@ -279,6 +313,7 @@ open class Toggle: Control, Changeable, FormFieldable { NSLayoutConstraint.deactivate(leftConstraints) NSLayoutConstraint.deactivate(rightConstraints) NSLayoutConstraint.deactivate(labelConstraints) + NSLayoutConstraint.activate(toggleConstraints) } } }