pujiaxin33 / JXSegmentedView

A powerful and easy to use segmented view (segmentedcontrol, pagingview, pagerview, pagecontrol, categoryview) (腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流APP分类切换滚动视图)
MIT License
2.65k stars 369 forks source link

请问下有swiftui的demo吗 #191

Open sakiraven opened 2 years ago

sakiraven commented 2 years ago

超级喜欢您的PagingViewController 请问有swiftui的demo吗

hstdt commented 2 years ago
import SwiftUI
import JXSegmentedView

struct JXSegmentedSwiftUIView: UIViewRepresentable {

    internal init(selectedIndex: Binding<Int>, segmentedDataSource: JXSegmentedViewDataSource, indicators: [UIView & JXSegmentedIndicatorProtocol]) {
        self._selectedIndex = selectedIndex
        self.segmentedDataSource = segmentedDataSource
        self.indicators = indicators
    }

    @Binding var selectedIndex: Int
    var segmentedDataSource: JXSegmentedViewDataSource
    var indicators: [UIView & JXSegmentedIndicatorProtocol]
    let segmentedView = JXSegmentedView()

    func updateUIView(_ uiView: JXSegmentedView, context: Context) {
        uiView.defaultSelectedIndex = selectedIndex
    }

    func makeUIView(context: Context) -> JXSegmentedView {
        segmentedView.delegate = context.coordinator
        segmentedView.defaultSelectedIndex = selectedIndex
        segmentedView.dataSource = segmentedDataSource
        segmentedView.indicators = indicators
        return segmentedView
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, JXSegmentedViewDelegate {
        var parent: JXSegmentedSwiftUIView

        init(_ parent: JXSegmentedSwiftUIView) {
            self.parent = parent
        }

        func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
            parent.selectedIndex = index
        }
    }

}

struct JXSegmentedSwiftUIView_Previews: PreviewProvider {

    struct Preview: View {

        @State private var selectedIndex: Int = 0
        var body: some View {
            JXSegmentedSwiftUIView(selectedIndex: $selectedIndex, segmentedDataSource: segmentedDataSource, indicators: indicators)
                .frame(height: 47)
        }

        var segmentedDataSource: JXSegmentedTitleDataSource {
            let segmentedDataSource = JXSegmentedTitleDataSource()
            segmentedDataSource.titles = ["1", "2"]
            segmentedDataSource.isTitleColorGradientEnabled = true
            return segmentedDataSource
        }

        var indicators: [UIView & JXSegmentedIndicatorProtocol] {
            let indicator = JXSegmentedIndicatorLineView()
            indicator.indicatorWidth = JXSegmentedViewAutomaticDimension
            indicator.lineStyle = .lengthen
            return [indicator]
        }
    }

    static var previews: some View {
        Preview()
    }
}
Lobooo commented 1 year ago
import SwiftUI
import JXSegmentedView

struct JXSegmentedSwiftUIView: UIViewRepresentable {

    internal init(selectedIndex: Binding<Int>, segmentedDataSource: JXSegmentedViewDataSource, indicators: [UIView & JXSegmentedIndicatorProtocol]) {
        self._selectedIndex = selectedIndex
        self.segmentedDataSource = segmentedDataSource
        self.indicators = indicators
    }

    @Binding var selectedIndex: Int
    var segmentedDataSource: JXSegmentedViewDataSource
    var indicators: [UIView & JXSegmentedIndicatorProtocol]
    let segmentedView = JXSegmentedView()

    func updateUIView(_ uiView: JXSegmentedView, context: Context) {
        uiView.defaultSelectedIndex = selectedIndex
    }

    func makeUIView(context: Context) -> JXSegmentedView {
        segmentedView.delegate = context.coordinator
        segmentedView.defaultSelectedIndex = selectedIndex
        segmentedView.dataSource = segmentedDataSource
        segmentedView.indicators = indicators
        return segmentedView
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, JXSegmentedViewDelegate {
        var parent: JXSegmentedSwiftUIView

        init(_ parent: JXSegmentedSwiftUIView) {
            self.parent = parent
        }

        func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
            parent.selectedIndex = index
        }
    }

}

struct JXSegmentedSwiftUIView_Previews: PreviewProvider {

    struct Preview: View {

        @State private var selectedIndex: Int = 0
        var body: some View {
            JXSegmentedSwiftUIView(selectedIndex: $selectedIndex, segmentedDataSource: segmentedDataSource, indicators: indicators)
                .frame(height: 47)
        }

        var segmentedDataSource: JXSegmentedTitleDataSource {
            let segmentedDataSource = JXSegmentedTitleDataSource()
            segmentedDataSource.titles = ["1", "2"]
            segmentedDataSource.isTitleColorGradientEnabled = true
            return segmentedDataSource
        }

        var indicators: [UIView & JXSegmentedIndicatorProtocol] {
            let indicator = JXSegmentedIndicatorLineView()
            indicator.indicatorWidth = JXSegmentedViewAutomaticDimension
            indicator.lineStyle = .lengthen
            return [indicator]
        }
    }

    static var previews: some View {
        Preview()
    }
}

NaviSegmentedControlViewController的 SwiftUI 版要如何写呢,能否有个完全的SwiftUI版,比如好可以支持SwiftUI的Picker()segmented 样式