diff --git a/Sources/SegmentedPicker/SegmentedPicker.swift b/Sources/SegmentedPicker/SegmentedPicker.swift index 422a1ac..a400bf8 100644 --- a/Sources/SegmentedPicker/SegmentedPicker.swift +++ b/Sources/SegmentedPicker/SegmentedPicker.swift @@ -11,10 +11,10 @@ public struct SegmentedPicker: View where Content: View, Selection: View { - + public typealias Data = [Element] - - @State private var frames: [CGRect] + + @State private var frames: [Data.Index: CGRect] = [:] @Binding private var selectedIndex: Data.Index? private let data: Data @@ -32,19 +32,18 @@ public struct SegmentedPicker: View self.content = content self.selection = selection self._selectedIndex = selectedIndex - self._frames = State(wrappedValue: Array(repeating: .zero, - count: data.count)) self.selectionAlignment = selectionAlignment } + public var body: some View { ZStack(alignment: Alignment(horizontal: .horizontalCenterAlignment, vertical: selectionAlignment)) { - if let selectedIndex = selectedIndex { + if let index = selectedIndex { selection() - .frame(width: frames[selectedIndex].width, - height: frames[selectedIndex].height) + .frame(width: selectionFrame(at: index).width, + height: selectionFrame(at: index).height) .alignmentGuide(.horizontalCenterAlignment) { dimensions in dimensions[HorizontalAlignment.center] } @@ -57,7 +56,9 @@ public struct SegmentedPicker: View ) .buttonStyle(PlainButtonStyle()) .background(GeometryReader { proxy in - Color.clear.onAppear { frames[index] = proxy.frame(in: .global) } + Color.clear.onAppear { + frames[index] = proxy.frame(in: .global) + } }) .alignmentGuide(.horizontalCenterAlignment, isActive: selectedIndex == index) { dimensions in @@ -67,4 +68,8 @@ public struct SegmentedPicker: View } } } + + private func selectionFrame(at index: Data.Index) -> CGRect { + frames[index] ?? .zero + } } diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift deleted file mode 100644 index 786bada..0000000 --- a/Tests/LinuxMain.swift +++ /dev/null @@ -1,7 +0,0 @@ -import XCTest - -import SegmentedPickerTests - -var tests = [XCTestCaseEntry]() -tests += SegmentedPickerTests.allTests() -XCTMain(tests) diff --git a/Tests/SegmentedPickerTests/SegmentedPickerTests.swift b/Tests/SegmentedPickerTests/SegmentedPickerTests.swift deleted file mode 100644 index 25d5f6e..0000000 --- a/Tests/SegmentedPickerTests/SegmentedPickerTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import XCTest -@testable import SegmentedPicker - -final class SegmentedPickerTests: XCTestCase { - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct - // results. - XCTAssertEqual(SegmentedPicker().text, "Hello, World!") - } - - static var allTests = [ - ("testExample", testExample), - ] -} diff --git a/Tests/SegmentedPickerTests/XCTestManifests.swift b/Tests/SegmentedPickerTests/XCTestManifests.swift deleted file mode 100644 index b918eef..0000000 --- a/Tests/SegmentedPickerTests/XCTestManifests.swift +++ /dev/null @@ -1,9 +0,0 @@ -import XCTest - -#if !canImport(ObjectiveC) -public func allTests() -> [XCTestCaseEntry] { - return [ - testCase(SegmentedPickerTests.allTests), - ] -} -#endif