remove unused and move code to new files (#17)

* remove unused and move code to new files

* move navBar modifier
This commit is contained in:
cecipirotto 2021-07-26 18:01:32 -03:00 committed by GitHub
parent 9ee8bcbf75
commit c3b73643dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 260 additions and 195 deletions

View File

@ -32,7 +32,7 @@ struct InstagramNavBarItem: View, PagerTabViewDelegate {
.background(Color.white)
}
func setSelectedState(state: PagerTabViewState) {
func setState(state: PagerTabViewState) {
switch state {
case .selected:
self.theme.imageColor = .black

View File

@ -27,7 +27,7 @@ struct TwitterNavBarItem: View, PagerTabViewDelegate {
.background(Color.white)
}
func setSelectedState(state: PagerTabViewState) {
func setState(state: PagerTabViewState) {
switch state {
case .selected:
self.theme.textColor = .blue

View File

@ -41,7 +41,7 @@ struct YoutubeNavBarItem: View, PagerTabViewDelegate {
.background(theme.backgroundColor)
}
func setSelectedState(state: PagerTabViewState) {
func setState(state: PagerTabViewState) {
switch state {
case .selected:
self.theme.textColor = selectedColor

View File

@ -12,6 +12,12 @@
28F828881C494B2C00330CF4 /* PagerTabStrip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28F8287D1C494B2C00330CF4 /* PagerTabStrip.framework */; };
28F8289A1C494B4200330CF4 /* iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28F828991C494B4200330CF4 /* iOS.swift */; };
C7A02C01269377D400BFE31B /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A02C00269377D400BFE31B /* DataStore.swift */; };
E07FB07A26AF36B400CDCFD8 /* PagerSetAppearModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB07926AF36B400CDCFD8 /* PagerSetAppearModifier.swift */; };
E07FB07C26AF373600CDCFD8 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB07B26AF373600CDCFD8 /* Extensions.swift */; };
E07FB07E26AF377D00CDCFD8 /* PagerTabItemModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB07D26AF377D00CDCFD8 /* PagerTabItemModifier.swift */; };
E07FB08026AF39C300CDCFD8 /* NavBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB07F26AF39C300CDCFD8 /* NavBarItem.swift */; };
E07FB08226AF3B7200CDCFD8 /* PagerTabViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB08126AF3B7200CDCFD8 /* PagerTabViewDelegate.swift */; };
E07FB08526AF3CAA00CDCFD8 /* NavBarModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07FB08426AF3CAA00CDCFD8 /* NavBarModifier.swift */; };
E1FA589924C8BC1B0081FBE7 /* XLPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA589824C8BC1B0081FBE7 /* XLPagerView.swift */; };
E1FA589A24C8BC1B0081FBE7 /* XLPagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA589824C8BC1B0081FBE7 /* XLPagerView.swift */; };
/* End PBXBuildFile section */
@ -35,6 +41,12 @@
28F8288E1C494B2C00330CF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
28F828991C494B4200330CF4 /* iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOS.swift; sourceTree = "<group>"; };
C7A02C00269377D400BFE31B /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = "<group>"; };
E07FB07926AF36B400CDCFD8 /* PagerSetAppearModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PagerSetAppearModifier.swift; sourceTree = "<group>"; };
E07FB07B26AF373600CDCFD8 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
E07FB07D26AF377D00CDCFD8 /* PagerTabItemModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PagerTabItemModifier.swift; sourceTree = "<group>"; };
E07FB07F26AF39C300CDCFD8 /* NavBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavBarItem.swift; sourceTree = "<group>"; };
E07FB08126AF3B7200CDCFD8 /* PagerTabViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PagerTabViewDelegate.swift; sourceTree = "<group>"; };
E07FB08426AF3CAA00CDCFD8 /* NavBarModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavBarModifier.swift; sourceTree = "<group>"; };
E1FA589824C8BC1B0081FBE7 /* XLPagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XLPagerView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -88,13 +100,27 @@
28F828971C494B4200330CF4 /* Sources */ = {
isa = PBXGroup;
children = (
E07FB08326AF3C6000CDCFD8 /* Modifiers */,
28F828991C494B4200330CF4 /* iOS.swift */,
E1FA589824C8BC1B0081FBE7 /* XLPagerView.swift */,
C7A02C00269377D400BFE31B /* DataStore.swift */,
E07FB07B26AF373600CDCFD8 /* Extensions.swift */,
E07FB07F26AF39C300CDCFD8 /* NavBarItem.swift */,
E07FB08126AF3B7200CDCFD8 /* PagerTabViewDelegate.swift */,
);
path = Sources;
sourceTree = "<group>";
};
E07FB08326AF3C6000CDCFD8 /* Modifiers */ = {
isa = PBXGroup;
children = (
E07FB07D26AF377D00CDCFD8 /* PagerTabItemModifier.swift */,
E07FB07926AF36B400CDCFD8 /* PagerSetAppearModifier.swift */,
E07FB08426AF3CAA00CDCFD8 /* NavBarModifier.swift */,
);
path = Modifiers;
sourceTree = "<group>";
};
E1FA589724C8BA020081FBE7 /* PagerTabStrip */ = {
isa = PBXGroup;
children = (
@ -215,9 +241,15 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E07FB07C26AF373600CDCFD8 /* Extensions.swift in Sources */,
E07FB08226AF3B7200CDCFD8 /* PagerTabViewDelegate.swift in Sources */,
E07FB07E26AF377D00CDCFD8 /* PagerTabItemModifier.swift in Sources */,
E1FA589924C8BC1B0081FBE7 /* XLPagerView.swift in Sources */,
C7A02C01269377D400BFE31B /* DataStore.swift in Sources */,
E07FB08526AF3CAA00CDCFD8 /* NavBarModifier.swift in Sources */,
E07FB07A26AF36B400CDCFD8 /* PagerSetAppearModifier.swift in Sources */,
28F8289A1C494B4200330CF4 /* iOS.swift in Sources */,
E07FB08026AF39C300CDCFD8 /* NavBarItem.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

21
Sources/Extensions.swift Normal file
View File

@ -0,0 +1,21 @@
//
// NavBarModifier.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
///
/// Public Source Code
///
extension View {
public func pagerTabItem<V>(@ViewBuilder _ pagerTabView: @escaping () -> V) -> some View where V: View {
return self.modifier(PagerTabItem(navTabView: pagerTabView))
}
public func onPageAppear(perform action: (() -> Void)?) -> some View {
return self.modifier(PagerSetAppearItem(onPageAppear: action ?? {}))
}
}

View File

@ -0,0 +1,55 @@
//
// NavBarModifier.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
internal struct NavBarModifier: ViewModifier {
@EnvironmentObject var pagerSettings: PagerSettings
@Binding private var indexSelected: Int
@Binding private var itemCount: Int
private var navBarItemWidth: CGFloat {
let totalItemWidth = (pagerSettings.width - (pagerSettings.tabItemSpacing * CGFloat(itemCount - 1)))
return totalItemWidth / CGFloat(itemCount)
}
public init(itemCount: Binding<Int>, selection: Binding<Int>) {
self._indexSelected = selection
self._itemCount = itemCount
}
func body(content: Content) -> some View {
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: pagerSettings.tabItemSpacing) {
if itemCount > 0 && pagerSettings.width > 0 {
ForEach(0...itemCount-1, id: \.self) { idx in
NavBarItem(id: idx, selection: $indexSelected)
.frame(height: pagerSettings.tabItemHeight)
}
}
}
.frame(height: pagerSettings.tabItemHeight)
HStack {
if let width = navBarItemWidth, width > 0, width <= pagerSettings.width {
let x = -self.pagerSettings.contentOffset / CGFloat(itemCount) + width / 2
Rectangle()
.fill(pagerSettings.indicatorBarColor)
.animation(.default)
.frame(width: width)
.position(x: x, y: 0)
}
}
.frame(height: pagerSettings.indicatorBarHeight)
content
}
}
}
internal extension GeometryReader {
func navBar(itemCount: Binding<Int>, selection: Binding<Int>) -> some View {
return self.modifier(NavBarModifier(itemCount: itemCount, selection: selection))
}
}

View File

@ -0,0 +1,35 @@
//
// PagerSetAppearModifier.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
internal struct PagerSetAppearItem: ViewModifier {
@EnvironmentObject var navContentViews : DataStore
@EnvironmentObject var pagerSettings: PagerSettings
var onPageAppear: () -> Void
@State var index = -1
init(onPageAppear: @escaping () -> Void) {
self.onPageAppear = onPageAppear
}
func body(content: Content) -> some View {
content
.overlay(
GeometryReader { reader in
Color.clear
.onAppear {
DispatchQueue.main.async {
let frame = reader.frame(in: .named("XLPagerViewScrollView"))
index = Int(round((frame.minX - pagerSettings.contentOffset) / pagerSettings.width))
navContentViews.setAppear(callback: onPageAppear, at: index)
}
}
}
)
}
}

View File

@ -0,0 +1,43 @@
//
// PagerTabItemModifier.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
internal struct PagerTabItem<NavTabView: View> : ViewModifier {
@EnvironmentObject var navContentViews : DataStore
@EnvironmentObject var pagerSettings: PagerSettings
var navTabView: () -> NavTabView
@State var index = -1
init(navTabView: @escaping () -> NavTabView) {
self.navTabView = navTabView
self.index = index
}
func body(content: Content) -> some View {
content
.overlay(
GeometryReader { reader in
Color.clear
.onAppear {
DispatchQueue.main.async {
let frame = reader.frame(in: .named("XLPagerViewScrollView"))
index = Int(round((frame.minX - pagerSettings.contentOffset) / pagerSettings.width))
let tabView = navTabView()
let tabViewDelegate = navTabView() as? PagerTabViewDelegate
navContentViews.setView(AnyView(tabView),
tabViewDelegate: tabViewDelegate,
at: index)
}
}.onDisappear {
navContentViews.items.value[index]?.tabViewDelegate?.setState(state: .normal)
navContentViews.remove(at: index)
}
}
)
}
}

32
Sources/NavBarItem.swift Normal file
View File

@ -0,0 +1,32 @@
//
// NavBarItem.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
internal struct NavBarItem: View {
@EnvironmentObject var navContentViews: DataStore
@Binding private var currentIndex: Int
private var id: Int
public init(id: Int, selection: Binding<Int>) {
self._currentIndex = selection
self.id = id
}
var body: some View {
if id < navContentViews.items.value.keys.count {
Button(action: {
self.currentIndex = id
}, label: {
navContentViews.items.value[id]?.view
}).buttonStyle(PlainButtonStyle())
.onLongPressGesture(minimumDuration: 0, maximumDistance: .infinity) { pressing in
navContentViews.items.value[id]?.tabViewDelegate?.setState(state: pressing ? .highlighted : .selected)
} perform: {}
}
}
}

View File

@ -0,0 +1,18 @@
//
// PagerTabViewDelegate.swift
// PagerTabStrip
//
// Created by Cecilia Pirotto on 26/7/21.
//
import SwiftUI
public enum PagerTabViewState {
case selected
case highlighted
case normal
}
public protocol PagerTabViewDelegate {
func setState(state: PagerTabViewState)
}

View File

@ -7,174 +7,8 @@
import SwiftUI
///
/// Private Source Code
/// Public Source Code
///
private struct PagerTabView<Content: View, NavTabView: View>: View {
@EnvironmentObject internal var navContentViews : DataStore
private var content: () -> Content
private var navTabView : () -> NavTabView
init(@ViewBuilder navTabView: @escaping () -> NavTabView, @ViewBuilder content: @escaping () -> Content) {
self.content = content
self.navTabView = navTabView
}
var body: some View {
content()
}
}
private struct PagerSetAppearItem: ViewModifier {
@EnvironmentObject var navContentViews : DataStore
@EnvironmentObject var pagerSettings: PagerSettings
var onPageAppear: () -> Void
@State var index = -1
init(onPageAppear: @escaping () -> Void) {
self.onPageAppear = onPageAppear
}
func body(content: Content) -> some View {
content
.overlay(
GeometryReader { reader in
Color.clear
.onAppear {
DispatchQueue.main.async {
let frame = reader.frame(in: .named("XLPagerViewScrollView"))
index = Int(round((frame.minX - pagerSettings.contentOffset) / pagerSettings.width))
navContentViews.setAppear(callback: onPageAppear, at: index)
}
}
}
)
}
}
private struct PagerTabItem<NavTabView: View> : ViewModifier {
@EnvironmentObject var navContentViews : DataStore
@EnvironmentObject var pagerSettings: PagerSettings
var navTabView: () -> NavTabView
@State var index = -1
init(navTabView: @escaping () -> NavTabView) {
self.navTabView = navTabView
self.index = index
}
func body(content: Content) -> some View {
PagerTabView(navTabView: navTabView) {
content
.overlay(
GeometryReader { reader in
Color.clear
.onAppear {
DispatchQueue.main.async {
let frame = reader.frame(in: .named("XLPagerViewScrollView"))
index = Int(round((frame.minX - pagerSettings.contentOffset) / pagerSettings.width))
let tabView = navTabView()
let tabViewDelegate = navTabView() as? PagerTabViewDelegate
navContentViews.setView(AnyView(tabView),
tabViewDelegate: tabViewDelegate,
at: index)
}
}.onDisappear {
navContentViews.items.value[index]?.tabViewDelegate?.setState(state: .normal)
navContentViews.remove(at: index)
}
}
)
}
}
}
private struct NavBarModifier: ViewModifier {
@EnvironmentObject var pagerSettings: PagerSettings
@Binding private var indexSelected: Int
@Binding private var itemCount: Int
private var navBarItemWidth: CGFloat {
let totalItemWidth = (pagerSettings.width - (pagerSettings.tabItemSpacing * CGFloat(itemCount - 1)))
return totalItemWidth / CGFloat(itemCount)
}
public init(itemCount: Binding<Int>, selection: Binding<Int>) {
self._indexSelected = selection
self._itemCount = itemCount
}
func body(content: Content) -> some View {
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: pagerSettings.tabItemSpacing) {
if itemCount > 0 && pagerSettings.width > 0 {
ForEach(0...itemCount-1, id: \.self) { idx in
NavBarItem(id: idx, selection: $indexSelected)
.frame(height: pagerSettings.tabItemHeight)
}
}
}
.frame(height: pagerSettings.tabItemHeight)
HStack {
if let width = navBarItemWidth, width > 0, width <= pagerSettings.width {
let x = -self.pagerSettings.contentOffset / CGFloat(itemCount) + width / 2
Rectangle()
.fill(pagerSettings.indicatorBarColor)
.animation(.default)
.frame(width: width)
.position(x: x, y: 0)
}
}
.frame(height: pagerSettings.indicatorBarHeight)
content
}
}
}
private struct PagerContainerView<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
content()
}
}
extension PagerContainerView {
@available(iOS 14.0, *)
internal func navBar(itemCount: Binding<Int>, selection: Binding<Int>) -> some View {
return self.modifier(NavBarModifier(itemCount: itemCount, selection: selection))
}
}
private struct NavBarItem: View {
@EnvironmentObject var navContentViews: DataStore
@Binding private var currentIndex: Int
private var id: Int
public init(id: Int, selection: Binding<Int>) {
self._currentIndex = selection
self.id = id
}
var body: some View {
if id < navContentViews.items.value.keys.count {
Button(action: {
self.currentIndex = id
}, label: {
navContentViews.items.value[id]?.view
}).buttonStyle(PlainButtonStyle())
.onLongPressGesture(minimumDuration: 0, maximumDistance: .infinity) { pressing in
navContentViews.items.value[id]?.tabViewDelegate?.setState(state: pressing ? .highlighted : .selected)
} perform: {}
}
}
}
public class PagerSettings: ObservableObject {
@Published var width: CGFloat = 0
@Published var tabItemSpacing: CGFloat
@ -191,10 +25,6 @@ public class PagerSettings: ObservableObject {
}
}
///
/// Public Source Code
///
@available(iOS 14.0, *)
public struct XLPagerView<Content> : View where Content : View {
@ -222,7 +52,7 @@ public struct XLPagerView<Content> : View where Content : View {
}
public var body: some View {
PagerContainerView {
// PagerContainerView {
GeometryReader { gproxy in
HStack(spacing: 0) {
content()
@ -288,7 +118,7 @@ public struct XLPagerView<Content> : View where Content : View {
.onAppear {
pagerSettings.width = gproxy.size.width
}
}
// }
}
.navBar(itemCount: $itemCount, selection: $currentIndex)
.environmentObject(self.navContentViews)
@ -308,22 +138,21 @@ public struct XLPagerView<Content> : View where Content : View {
}
}
public enum PagerTabViewState {
case selected
case highlighted
case normal
}
public protocol PagerTabViewDelegate {
func setState(state: PagerTabViewState)
}
extension View {
public func pagerTabItem<V>(@ViewBuilder _ pagerTabView: @escaping () -> V) -> some View where V: View {
return self.modifier(PagerTabItem(navTabView: pagerTabView))
}
public func onPageAppear(perform action: (() -> Void)?) -> some View {
return self.modifier(PagerSetAppearItem(onPageAppear: action ?? {}))
}
}
//private struct PagerContainerView<Content: View>: View {
// let content: () -> Content
//
// init(@ViewBuilder content: @escaping () -> Content) {
// self.content = content
// }
//
// var body: some View {
// content()
// }
//}
//
//extension PagerContainerView {
// @available(iOS 14.0, *)
// internal func navBar(itemCount: Binding<Int>, selection: Binding<Int>) -> some View {
// return self.modifier(NavBarModifier(itemCount: itemCount, selection: selection))
// }
//}