Эх сурвалжийг харах

区分content left or right Padding

RandyWei 8 сар өмнө
parent
commit
b749ce457e

+ 5 - 5
Sources/ACarousel/ACarousel.swift

@@ -74,9 +74,9 @@ extension ACarousel {
     ///   - autoScroll: A enum that define view to scroll automatically. See
     ///     ``ACarouselAutoScroll``. default is `inactive`.
     ///   - content: The view builder that creates views dynamically.
-    public init(_ data: Data, id: KeyPath<Data.Element, ID>, index: Binding<Int> = .constant(0), spacing: CGFloat = 10, headspace: CGFloat = 10, sidesScaling: CGFloat = 0.8, isWrap: Bool = false, autoScroll: ACarouselAutoScroll = .inactive, canMove: Bool = true, @ViewBuilder content: @escaping (Data.Element) -> Content) {
+    public init(_ data: Data, id: KeyPath<Data.Element, ID>, index: Binding<Int> = .constant(0), spacing: CGFloat = 10, contentPadding: [Int] = [10,10], sidesScaling: CGFloat = 0.8, isWrap: Bool = false, autoScroll: ACarouselAutoScroll = .inactive, canMove: Bool = true, @ViewBuilder content: @escaping (Data.Element) -> Content) {
         
-        self.viewModel = ACarouselViewModel(data, id: id, index: index, spacing: spacing, headspace: headspace, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
+        self.viewModel = ACarouselViewModel(data, id: id, index: index, spacing: spacing, contentPadding: contentPadding, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
         self.content = content
     }
     
@@ -100,9 +100,9 @@ extension ACarousel where ID == Data.Element.ID, Data.Element : Identifiable {
     ///   - autoScroll: A enum that define view to scroll automatically. See
     ///     ``ACarouselAutoScroll``. default is `inactive`.
     ///   - content: The view builder that creates views dynamically.
-    public init(_ data: Data, index: Binding<Int> = .constant(0), spacing: CGFloat = 10, headspace: CGFloat = 10, sidesScaling: CGFloat = 0.8, isWrap: Bool = false, autoScroll: ACarouselAutoScroll = .inactive, canMove: Bool = true, @ViewBuilder content: @escaping (Data.Element) -> Content) {
+    public init(_ data: Data, index: Binding<Int> = .constant(0), spacing: CGFloat = 10, contentPadding: [Int] = [10,10], sidesScaling: CGFloat = 0.8, isWrap: Bool = false, autoScroll: ACarouselAutoScroll = .inactive, canMove: Bool = true, @ViewBuilder content: @escaping (Data.Element) -> Content) {
         
-        self.viewModel = ACarouselViewModel(data, index: index, spacing: spacing, headspace: headspace, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
+        self.viewModel = ACarouselViewModel(data, index: index, spacing: spacing, contentPadding: contentPadding, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
         self.content = content
     }
     
@@ -115,7 +115,7 @@ struct ACarousel_LibraryContent: LibraryContentProvider {
     @LibraryContentBuilder
     var views: [LibraryItem] {
         LibraryItem(ACarousel(Datas) { _ in }, title: "ACarousel", category: .control)
-        LibraryItem(ACarousel(Datas, index: .constant(0), spacing: 10, headspace: 10, sidesScaling: 0.8, isWrap: false, autoScroll: .inactive) { _ in }, title: "ACarousel full parameters", category: .control)
+        LibraryItem(ACarousel(Datas, index: .constant(0), spacing: 10, contentPadding: [10,10], sidesScaling: 0.8, isWrap: false, autoScroll: .inactive) { _ in }, title: "ACarousel full parameters", category: .control)
     }
 
     struct _Item: Identifiable {

+ 15 - 11
Sources/ACarousel/ACarouselViewModel.swift

@@ -31,13 +31,13 @@ class ACarouselViewModel<Data, ID>: ObservableObject where Data : RandomAccessCo
     private let _data: Data
     private let _dataId: KeyPath<Data.Element, ID>
     private let _spacing: CGFloat
-    private let _headspace: CGFloat
+    private let _contentPadding: [Int]
     private let _isWrap: Bool
     private let _sidesScaling: CGFloat
     private let _autoScroll: ACarouselAutoScroll
     private let _canMove: Bool
     
-    init(_ data: Data, id: KeyPath<Data.Element, ID>, index: Binding<Int>, spacing: CGFloat, headspace: CGFloat, sidesScaling: CGFloat, isWrap: Bool, autoScroll: ACarouselAutoScroll, canMove: Bool) {
+    init(_ data: Data, id: KeyPath<Data.Element, ID>, index: Binding<Int>, spacing: CGFloat, contentPadding: [Int], sidesScaling: CGFloat, isWrap: Bool, autoScroll: ACarouselAutoScroll, canMove: Bool) {
         
         guard index.wrappedValue < data.count else {
             fatalError("The index should be less than the count of data ")
@@ -46,7 +46,7 @@ class ACarouselViewModel<Data, ID>: ObservableObject where Data : RandomAccessCo
         self._data = data
         self._dataId = id
         self._spacing = spacing
-        self._headspace = headspace
+        self._contentPadding = contentPadding
         self._isWrap = isWrap
         self._sidesScaling = sidesScaling
         self._autoScroll = autoScroll
@@ -105,8 +105,8 @@ class ACarouselViewModel<Data, ID>: ObservableObject where Data : RandomAccessCo
 
 extension ACarouselViewModel where ID == Data.Element.ID, Data.Element : Identifiable {
     
-    convenience init(_ data: Data, index: Binding<Int>, spacing: CGFloat, headspace: CGFloat, sidesScaling: CGFloat, isWrap: Bool, autoScroll: ACarouselAutoScroll, canMove: Bool) {
-        self.init(data, id: \.id, index: index, spacing: spacing, headspace: headspace, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
+    convenience init(_ data: Data, index: Binding<Int>, spacing: CGFloat, contentPadding: [Int], sidesScaling: CGFloat, isWrap: Bool, autoScroll: ACarouselAutoScroll, canMove: Bool) {
+        self.init(data, id: \.id, index: index, spacing: spacing, contentPadding: contentPadding, sidesScaling: sidesScaling, isWrap: isWrap, autoScroll: autoScroll, canMove: canMove)
     }
 }
 
@@ -142,7 +142,7 @@ extension ACarouselViewModel {
     }
     
     var itemWidth: CGFloat {
-        max(0, viewSize.width - defaultPadding * 2)
+        max(0, viewSize.width - defaultLeftPadding - defaultRightPadding)
     }
     
     var timer: TimePublisher? {
@@ -177,8 +177,12 @@ extension ACarouselViewModel {
         return t > 0 ? _autoScroll : .defaultActive
     }
     
-    private var defaultPadding: CGFloat {
-        return (_headspace + spacing)
+    private var defaultLeftPadding: CGFloat {
+        return CGFloat(_contentPadding[0]) + spacing
+    }
+    
+    private var defaultRightPadding: CGFloat {
+        return  CGFloat(_contentPadding[1]) + spacing
     }
     
     private var itemActualWidth: CGFloat {
@@ -201,7 +205,7 @@ extension ACarouselViewModel {
     /// current offset value
     var offset: CGFloat {
         let activeOffset = CGFloat(activeIndex) * itemActualWidth
-        return defaultPadding - activeOffset + dragOffset
+        return defaultLeftPadding - activeOffset + dragOffset
     }
     
     /// change offset when acitveItem changes
@@ -211,8 +215,8 @@ extension ACarouselViewModel {
             return
         }
         
-        let minimumOffset = defaultPadding
-        let maxinumOffset = defaultPadding - CGFloat(data.count - 1) * itemActualWidth
+        let minimumOffset = defaultLeftPadding
+        let maxinumOffset = defaultLeftPadding - CGFloat(data.count - 1) * itemActualWidth
         
         if offset == minimumOffset {
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {