我的应用程序工作正常,但有很多重复的代码.
我不知道如何重构GeometryReader,也不知道如何使用ForEach更改代码以符合MVVM设计模式.最后,这个应该放到垂直的ScrollView中吗?
任何方向都可以学习如何编写更简洁的SWIFT代码.
import SwiftUI
struct ContentView: View {
let colorFriendship = LinearGradient(colors: [Color("ColorFriendshipLight"), Color("ColorFriendshipDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorWealth = LinearGradient(colors: [Color("ColorWealthLight"), Color("ColorWealthDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorEducation = LinearGradient(colors: [Color("ColorEducationLight"), Color("ColorEducationDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorCareer = LinearGradient(colors: [Color("ColorCareerLight"), Color("ColorCareerDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorFamily = LinearGradient(colors: [Color("ColorFamilyLight"), Color("ColorFamilyDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorHealth = LinearGradient(colors: [Color("ColorHealthLight"), Color("ColorHealthDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorSpirituality = LinearGradient(colors: [Color("ColorSpiritualityLight"), Color("ColorSpiritualityDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
let colorCompose = LinearGradient(colors: [Color("ColorComposeLight"), Color("ColorComposeDark")], startPoint: .topLeading, endPoint: .bottomTrailing)
// Shadow Icons
private var radius = 7
private var xOffset = 6
private var yOffset = 6
var body: some View {
VStack {
NavigationView {
VStack {
HStack {
NavigationLink(destination: FriendshipListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-friendship")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorCareerDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Friendships")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(20)
.background(colorFriendship)
.cornerRadius(20)
}
NavigationLink(destination: WealthListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-wealth")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorWealthDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Wealth")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(20)
.background(colorWealth)
.cornerRadius(20)
}
}
HStack {
NavigationLink(destination: EducationListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-education")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorEducationDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Education")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorEducation)
.cornerRadius(20)
}
NavigationLink(destination: CareerListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-career")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorCareerDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Career")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorCareer)
.cornerRadius(20)
}
}
HStack {
NavigationLink(destination: FamilyListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-family")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorFamilyDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Family")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorFamily)
.cornerRadius(20)
}
NavigationLink(destination: HealthListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-health")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorHealthDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Health")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorHealth)
.cornerRadius(20)
}
}
HStack {
NavigationLink(destination: SpiritualityListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-spirituality")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorSpiritualityDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Spirituality")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorSpirituality)
.cornerRadius(20)
}
NavigationLink(destination: ComposeListView()) {
VStack(alignment: .center) {
GeometryReader { geo in
Image("menu-icon-compose")
.resizable()
.scaledToFit()
.frame(
width: geo.size.width,
height: geo.size.height)
.shadow(color: Color("ColorSpiritualityDark"), radius: CGFloat(radius), x: CGFloat(xOffset), y: CGFloat(yOffset))
}
Text("Compose")
.titleStyle()
}
.frame(maxWidth: .infinity, maxHeight: 110)
.padding(30)
.background(colorCompose)
.cornerRadius(20)
}
}
}
.navigationTitle("Main Menu")
}
}
.padding(.horizontal)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
// Custom modifiers
// MenuTitle
struct MenuTitle: ViewModifier {
func body(content: Content) -> some View {
content
.font(.system(.title2, design: .rounded))
.foregroundColor(.white)
.fontWeight(.regular)
.shadow(color: Color(.black), radius: 7, x: 2, y: 2)
}
}
extension View {
func titleStyle() -> some View {
modifier(MenuTitle())
}
}
// Struct List Views
struct FriendshipListView:View {
var body: some View {
Text("Friendship List")
}
}
struct WealthListView:View {
var body: some View {
Text("Wealth List")
}
}
struct EducationListView:View {
var body: some View {
Text("Education List")
}
}
struct CareerListView:View {
var body: some View {
Text("Career List")
}
}
struct FamilyListView:View {
var body: some View {
Text("Family List")
}
}
struct HealthListView:View {
var body: some View {
Text("Health List")
}
}
struct SpiritualityListView:View {
var body: some View {
Text("Spirituality List")
}
}
struct ComposeListView:View {
var body: some View {
Text("Compose List")
}
}