页面uodate
This commit is contained in:
@@ -43,6 +43,7 @@
|
|||||||
96E93E9D2B622D00004AB649 /* NavigationPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93E9C2B622D00004AB649 /* NavigationPageView.swift */; };
|
96E93E9D2B622D00004AB649 /* NavigationPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93E9C2B622D00004AB649 /* NavigationPageView.swift */; };
|
||||||
96E93E9F2B62305F004AB649 /* UserNicknameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93E9E2B62305F004AB649 /* UserNicknameView.swift */; };
|
96E93E9F2B62305F004AB649 /* UserNicknameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93E9E2B62305F004AB649 /* UserNicknameView.swift */; };
|
||||||
96E93EA12B623D4E004AB649 /* MessageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93EA02B623D4E004AB649 /* MessageDetailView.swift */; };
|
96E93EA12B623D4E004AB649 /* MessageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93EA02B623D4E004AB649 /* MessageDetailView.swift */; };
|
||||||
|
96E93EA32B63B164004AB649 /* RadioButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E93EA22B63B164004AB649 /* RadioButton.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@@ -83,6 +84,7 @@
|
|||||||
96E93E9C2B622D00004AB649 /* NavigationPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationPageView.swift; sourceTree = "<group>"; };
|
96E93E9C2B622D00004AB649 /* NavigationPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationPageView.swift; sourceTree = "<group>"; };
|
||||||
96E93E9E2B62305F004AB649 /* UserNicknameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserNicknameView.swift; sourceTree = "<group>"; };
|
96E93E9E2B62305F004AB649 /* UserNicknameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserNicknameView.swift; sourceTree = "<group>"; };
|
||||||
96E93EA02B623D4E004AB649 /* MessageDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageDetailView.swift; sourceTree = "<group>"; };
|
96E93EA02B623D4E004AB649 /* MessageDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageDetailView.swift; sourceTree = "<group>"; };
|
||||||
|
96E93EA22B63B164004AB649 /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -171,6 +173,7 @@
|
|||||||
968A6FB12B5FC3A2008609EE /* ShowMore.swift */,
|
968A6FB12B5FC3A2008609EE /* ShowMore.swift */,
|
||||||
968A6FB32B610C67008609EE /* KillCountDown.swift */,
|
968A6FB32B610C67008609EE /* KillCountDown.swift */,
|
||||||
968A6FB52B6113BE008609EE /* UserAccountCard.swift */,
|
968A6FB52B6113BE008609EE /* UserAccountCard.swift */,
|
||||||
|
96E93EA22B63B164004AB649 /* RadioButton.swift */,
|
||||||
);
|
);
|
||||||
path = Components;
|
path = Components;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -359,6 +362,7 @@
|
|||||||
968A6F7F2B5F4E91008609EE /* HomeView.swift in Sources */,
|
968A6F7F2B5F4E91008609EE /* HomeView.swift in Sources */,
|
||||||
968A6FA22B5F68AA008609EE /* ForgotView.swift in Sources */,
|
968A6FA22B5F68AA008609EE /* ForgotView.swift in Sources */,
|
||||||
968A6F792B5F4E28008609EE /* TabBarView.swift in Sources */,
|
968A6F792B5F4E28008609EE /* TabBarView.swift in Sources */,
|
||||||
|
96E93EA32B63B164004AB649 /* RadioButton.swift in Sources */,
|
||||||
96E93E9F2B62305F004AB649 /* UserNicknameView.swift in Sources */,
|
96E93E9F2B62305F004AB649 /* UserNicknameView.swift in Sources */,
|
||||||
968A6FA82B5F6AF3008609EE /* CartView.swift in Sources */,
|
968A6FA82B5F6AF3008609EE /* CartView.swift in Sources */,
|
||||||
968A6FAA2B5F6B07008609EE /* CategoryView.swift in Sources */,
|
968A6FAA2B5F6B07008609EE /* CategoryView.swift in Sources */,
|
||||||
|
|||||||
Binary file not shown.
29
demo/Components/RadioButton.swift
Normal file
29
demo/Components/RadioButton.swift
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
//
|
||||||
|
// RadioButton.swift
|
||||||
|
// demo
|
||||||
|
//
|
||||||
|
// Created by Jason on 2024/1/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct RadioButton: View {
|
||||||
|
@Binding public var checked: Bool
|
||||||
|
var label: String = ""
|
||||||
|
var labelSize: Double = 14
|
||||||
|
var radioSize: Double = 18
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack(spacing: 4, content: {
|
||||||
|
Image(systemName: checked ? "checkmark.circle.fill" : "circle")
|
||||||
|
.resizable()
|
||||||
|
.frame(width: radioSize, height: radioSize)
|
||||||
|
.foregroundColor(checked ? Color.orange : Color.gray)
|
||||||
|
Text(label)
|
||||||
|
.font(.system(size: labelSize))
|
||||||
|
})
|
||||||
|
.onTapGesture {
|
||||||
|
checked.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,13 +17,13 @@ struct TabItem: Identifiable {
|
|||||||
var tabItems = [
|
var tabItems = [
|
||||||
TabItem(icon: "book", text: "图书馆", tab: .home),
|
TabItem(icon: "book", text: "图书馆", tab: .home),
|
||||||
TabItem(icon: "bag", text: "生活馆", tab: .explore),
|
TabItem(icon: "bag", text: "生活馆", tab: .explore),
|
||||||
TabItem(icon: "cart", text: "购物车", tab: .message),
|
TabItem(icon: "cart", text: "购物车", tab: .cart),
|
||||||
TabItem(icon: "person", text: "个人中心", tab: .account)
|
TabItem(icon: "person", text: "个人中心", tab: .account)
|
||||||
]
|
]
|
||||||
|
|
||||||
enum Tab: String {
|
enum Tab: String {
|
||||||
case home
|
case home
|
||||||
case explore
|
case explore
|
||||||
case message
|
case cart
|
||||||
case account
|
case account
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,12 +22,10 @@ struct HomeView: View {
|
|||||||
PartyReading
|
PartyReading
|
||||||
NewBooks
|
NewBooks
|
||||||
Categories
|
Categories
|
||||||
Spacer()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.bottom, 48)
|
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(Color.gray.opacity(0.2))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,23 +12,19 @@ struct TabBarView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationView {
|
NavigationView {
|
||||||
ZStack(alignment: .leading) {
|
ZStack {
|
||||||
Group {
|
Group {
|
||||||
switch selectedTab {
|
switch selectedTab {
|
||||||
case .home:
|
case .home:
|
||||||
HomeView()
|
HomeView()
|
||||||
case .explore:
|
case .explore:
|
||||||
MallView()
|
MallView()
|
||||||
case .message:
|
case .cart:
|
||||||
MessageView()
|
CartView()
|
||||||
case .account:
|
case .account:
|
||||||
UserView()
|
UserView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// .offset(y: -64)
|
|
||||||
// .safeAreaInset(edge: .top) {
|
|
||||||
// Color.clear.frame(height: 32)
|
|
||||||
// }
|
|
||||||
|
|
||||||
HStack {
|
HStack {
|
||||||
ForEach(tabItems) { item in
|
ForEach(tabItems) { item in
|
||||||
@@ -49,14 +45,11 @@ struct TabBarView: View {
|
|||||||
.shadow(color: selectedTab == item.tab ? Color.orange : Color.blue, radius: 15)
|
.shadow(color: selectedTab == item.tab ? Color.orange : Color.blue, radius: 15)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.top, 12.0)
|
.padding(.vertical, 12.0)
|
||||||
.padding(.bottom, 32)
|
|
||||||
.background(Color("TabBarColor"))
|
.background(Color("TabBarColor"))
|
||||||
.frame(maxHeight: .infinity, alignment: .bottom)
|
.frame(maxHeight: .infinity, alignment: .bottom)
|
||||||
.shadow(color: Color.gray.opacity(0.5), radius: 6, x: 0, y: 6)
|
.shadow(color: Color.gray.opacity(0.5), radius: 6, x: 0, y: 6)
|
||||||
.ignoresSafeArea()
|
|
||||||
}
|
}
|
||||||
.statusBarHidden(false)
|
|
||||||
}
|
}
|
||||||
.navigationViewStyle(.columns)
|
.navigationViewStyle(.columns)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,67 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct CartView: View {
|
struct CartView: View {
|
||||||
|
@State private var isCheckAll = false
|
||||||
|
@State private var canSettle: Bool = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
VStack(spacing: 0) {
|
||||||
|
HStack(spacing: 2) {
|
||||||
|
Text("购物车")
|
||||||
|
.font(.system(size: 18))
|
||||||
|
Text("(12)")
|
||||||
|
.font(.system(size: 12))
|
||||||
|
.foregroundColor(Color.gray)
|
||||||
|
Spacer()
|
||||||
|
Text("管理")
|
||||||
|
.font(.system(size: 16))
|
||||||
|
.foregroundColor(Color.black)
|
||||||
|
.onTapGesture {
|
||||||
|
canSettle.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.horizontal, 16)
|
||||||
|
.padding(.bottom, 12)
|
||||||
|
ScrollView(.vertical, showsIndicators: false) {
|
||||||
|
VStack(spacing: 12) {
|
||||||
|
ForEach(0 ..< 22) { _ in
|
||||||
|
Rectangle()
|
||||||
|
.fill(Color.white)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.frame(height: 100)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.bottom, 12)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
.padding(.horizontal, 12)
|
||||||
|
|
||||||
|
HStack(alignment: .center, spacing: 4) {
|
||||||
|
RadioButton(checked: $isCheckAll, label: "全选")
|
||||||
|
Spacer()
|
||||||
|
Text("合计")
|
||||||
|
.font(.system(size: 14))
|
||||||
|
CamelPrice(amount: 0)
|
||||||
|
Text("结 算")
|
||||||
|
.font(.system(size: 14))
|
||||||
|
.padding(.horizontal, 24)
|
||||||
|
.padding(.vertical, 12)
|
||||||
|
.foregroundColor(Color.white)
|
||||||
|
.background(
|
||||||
|
LinearGradient(colors: [
|
||||||
|
canSettle ? Color.orange : Color.gray.opacity(0.5),
|
||||||
|
canSettle ? Color.red : Color.gray,
|
||||||
|
], startPoint: .leading, endPoint: .trailing)
|
||||||
|
)
|
||||||
|
.cornerRadius(32)
|
||||||
|
.onTapGesture {}
|
||||||
|
}
|
||||||
|
.padding(12)
|
||||||
|
.background(Color.white)
|
||||||
|
}
|
||||||
|
.animation(.linear(duration: 10), value: isCheckAll)
|
||||||
|
.padding(.bottom, 62)
|
||||||
|
.background(Color.gray.opacity(0.2))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ import SwiftUI
|
|||||||
|
|
||||||
struct MallView: View {
|
struct MallView: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Text("Mall Page")
|
ZStack(alignment: .topLeading) {
|
||||||
|
Text("Mall")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ import SwiftUI
|
|||||||
|
|
||||||
struct CouponView: View {
|
struct CouponView: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
ZStack {
|
||||||
|
Text("Coupon view")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,12 @@ struct UserView: View {
|
|||||||
@State private var showDetail = false
|
@State private var showDetail = false
|
||||||
@State private var showUserInfo = false
|
@State private var showUserInfo = false
|
||||||
|
|
||||||
|
var grayBackground = Color.gray.opacity(0.2)
|
||||||
|
|
||||||
|
init() {
|
||||||
|
print(UIScreen.main.bounds.width)
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView(.vertical, showsIndicators: false) {
|
ScrollView(.vertical, showsIndicators: false) {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
@@ -23,7 +29,6 @@ struct UserView: View {
|
|||||||
Recommend
|
Recommend
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.bottom, 48)
|
|
||||||
.animation(.spring, value: showDetail)
|
.animation(.spring, value: showDetail)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +91,6 @@ struct UserView: View {
|
|||||||
RoundedRectangle(cornerRadius: 12)
|
RoundedRectangle(cornerRadius: 12)
|
||||||
.offset(y: 12)
|
.offset(y: 12)
|
||||||
)
|
)
|
||||||
|
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,9 +105,29 @@ struct UserView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
.padding(12)
|
.padding(.top, 12)
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(
|
||||||
|
Color.white
|
||||||
|
.overlay(alignment: .top) {
|
||||||
|
RoundedRectangle(cornerRadius: 12)
|
||||||
|
.fill(LinearGradient(colors: [Color.orange.opacity(0.3), grayBackground], startPoint: .top, endPoint: .bottom))
|
||||||
|
.frame(height: 92)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.clipped()
|
||||||
|
|
||||||
|
// Rectangle()
|
||||||
|
// .fill(Color.white)
|
||||||
|
// .frame(height: 12)
|
||||||
|
// .overlay {
|
||||||
|
// RoundedRectangle(cornerRadius: 12)
|
||||||
|
// .fill(grayBackground)
|
||||||
|
// .frame(height: 24)
|
||||||
|
// .offset(y: 6)
|
||||||
|
// }
|
||||||
|
// .clipped()
|
||||||
}
|
}
|
||||||
|
|
||||||
var Notice: some View {
|
var Notice: some View {
|
||||||
@@ -142,8 +166,8 @@ struct UserView: View {
|
|||||||
.background(Color.white)
|
.background(Color.white)
|
||||||
.cornerRadius(8)
|
.cornerRadius(8)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.bottom, 12)
|
.padding(.vertical, 12)
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(grayBackground)
|
||||||
}
|
}
|
||||||
|
|
||||||
var OrderShow: some View {
|
var OrderShow: some View {
|
||||||
@@ -197,7 +221,7 @@ struct UserView: View {
|
|||||||
.cornerRadius(6)
|
.cornerRadius(6)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.bottom, 12)
|
.padding(.bottom, 12)
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(grayBackground)
|
||||||
}
|
}
|
||||||
|
|
||||||
var Coupons: some View {
|
var Coupons: some View {
|
||||||
@@ -205,6 +229,9 @@ struct UserView: View {
|
|||||||
HStack {
|
HStack {
|
||||||
Spacer()
|
Spacer()
|
||||||
ForEach(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { _ in
|
ForEach(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { _ in
|
||||||
|
NavigationLink {
|
||||||
|
CouponView()
|
||||||
|
} label: {
|
||||||
VStack {
|
VStack {
|
||||||
Image(systemName: "wallet.pass")
|
Image(systemName: "wallet.pass")
|
||||||
.resizable()
|
.resizable()
|
||||||
@@ -225,6 +252,7 @@ struct UserView: View {
|
|||||||
.font(.system(size: 12))
|
.font(.system(size: 12))
|
||||||
.foregroundColor(Color.gray)
|
.foregroundColor(Color.gray)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,7 +263,7 @@ struct UserView: View {
|
|||||||
.cornerRadius(6)
|
.cornerRadius(6)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.bottom, 12)
|
.padding(.bottom, 12)
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(grayBackground)
|
||||||
}
|
}
|
||||||
|
|
||||||
let columns = [GridItem(.flexible(), spacing: 12), GridItem(.flexible(), spacing: 12)]
|
let columns = [GridItem(.flexible(), spacing: 12), GridItem(.flexible(), spacing: 12)]
|
||||||
@@ -262,7 +290,7 @@ struct UserView: View {
|
|||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.bottom, 12)
|
.padding(.bottom, 12)
|
||||||
.background(Color.gray.opacity(0.2))
|
.background(grayBackground)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user