Repository: realvjy/temperature-swiftui Branch: main Commit: 79c72b76f0d5 Files: 38 Total size: 67.6 KB Directory structure: gitextract_3w52m8_3/ ├── README.md ├── Temperature/ │ ├── Assets.xcassets/ │ │ ├── AccentColor.colorset/ │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Avatar 1.imageset/ │ │ │ └── Contents.json │ │ ├── Avatar5.imageset/ │ │ │ └── Contents.json │ │ ├── BG.colorset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Spline.imageset/ │ │ │ └── Contents.json │ │ ├── cold.imageset/ │ │ │ └── Contents.json │ │ ├── curve-nob.imageset/ │ │ │ └── Contents.json │ │ ├── fire.imageset/ │ │ │ └── Contents.json │ │ ├── mark-num.imageset/ │ │ │ └── Contents.json │ │ ├── nob.imageset/ │ │ │ └── Contents.json │ │ └── normal.imageset/ │ │ └── Contents.json │ ├── ContentView.swift │ ├── Preview Content/ │ │ └── Preview Assets.xcassets/ │ │ └── Contents.json │ ├── RiveAssets/ │ │ ├── button.riv │ │ ├── check.riv │ │ ├── confetti.riv │ │ ├── house.riv │ │ ├── icons.riv │ │ ├── menu_button.riv │ │ ├── shapes.riv │ │ └── water.riv │ ├── TemperatureApp.swift │ ├── Utilities/ │ │ └── Extensions.swift │ ├── View/ │ │ ├── Home.swift │ │ └── Tube.swift │ └── WaterWave.swift ├── Temperature.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata/ │ │ └── xcschemes/ │ │ └── Temperature.xcscheme │ └── xcuserdata/ │ └── vijayverma.xcuserdatad/ │ ├── xcdebugger/ │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes/ │ └── xcschememanagement.plist ├── TemperatureTests/ │ └── TemperatureTests.swift └── TemperatureUITests/ ├── TemperatureUITests.swift └── TemperatureUITestsLaunchTests.swift ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ # temperature-swiftui ![temperature](https://user-images.githubusercontent.com/7387461/228286617-0a7b1d6e-5085-4756-b0cc-38d1f5c0f66c.gif) More behind the story here https://twitter.com/realvjy/status/1640342553563217920 ================================================ FILE: Temperature/Assets.xcassets/AccentColor.colorset/Contents.json ================================================ { "colors" : [ { "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "filename" : "AppIcon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/Avatar 1.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Avatar 1.jpg", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/Avatar5.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Avatar 5.jpg", "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: Temperature/Assets.xcassets/BG.colorset/Contents.json ================================================ { "colors" : [ { "color" : { "color-space" : "srgb", "components" : { "alpha" : "1.000", "blue" : "0.951", "green" : "0.943", "red" : "0.933" } }, "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/Spline.imageset/Contents.json ================================================ { "images" : [ { "filename" : "Spline.png", "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/cold.imageset/Contents.json ================================================ { "images" : [ { "filename" : "cold.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "cold@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "cold@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/curve-nob.imageset/Contents.json ================================================ { "images" : [ { "filename" : "curve-nob.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "curve-nob@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "curve-nob@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/fire.imageset/Contents.json ================================================ { "images" : [ { "filename" : "fire.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "fire@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "fire@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/mark-num.imageset/Contents.json ================================================ { "images" : [ { "filename" : "mark-num.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "mark-num@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "mark-num@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/nob.imageset/Contents.json ================================================ { "images" : [ { "filename" : "nob.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "nob@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "nob@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/Assets.xcassets/normal.imageset/Contents.json ================================================ { "images" : [ { "filename" : "normal.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "normal@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "normal@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/ContentView.swift ================================================ // // ContentView.swift // Temperature // // Created by vijay verma on 24/03/23. // import SwiftUI struct ContentView: View { @State private var waveOffset: CGFloat = 0 @State var progress: CGFloat = 0.5 @State var startAnimation: CGFloat = 0 @State var waterFill: CGFloat = 0.5 var body: some View { ZStack { LinearGradient(gradient: Gradient(colors: [Color(red: 1.0, green: 1.0, blue: 1.0, opacity: 1), Color(red: 0.93, green: 0.94, blue: 0.97, opacity: 1)]), startPoint: .init(x: 0.0, y: 0.75), endPoint: .init(x: 1.0, y: 1.0)) .edgesIgnoringSafeArea(.all) Tube() } // VStack { // WaterWave() // VStack { // Image(systemName: "globe") // .imageScale(.large) // .foregroundColor(.accentColor) // Text("Hello, world!") // } // .padding() // Spacer() // } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } ================================================ FILE: Temperature/Preview Content/Preview Assets.xcassets/Contents.json ================================================ { "info" : { "author" : "xcode", "version" : 1 } } ================================================ FILE: Temperature/TemperatureApp.swift ================================================ // // TemperatureApp.swift // Temperature // // Created by vijay verma on 24/03/23. // import SwiftUI @main struct TemperatureApp: App { var body: some Scene { WindowGroup { ContentView() } } } ================================================ FILE: Temperature/Utilities/Extensions.swift ================================================ // // Extensions.swift // Temperature // // Created by vijay verma on 24/03/23. // import SwiftUI extension UIColor { convenience init(hex: String) { var hexString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() if hexString.hasPrefix("#") { hexString.remove(at: hexString.startIndex) } var rgbValue: UInt64 = 0 Scanner(string: hexString).scanHexInt64(&rgbValue) let red = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0 let green = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0 let blue = CGFloat(rgbValue & 0x0000FF) / 255.0 self.init(red: red, green: green, blue: blue, alpha: 1.0) } } ================================================ FILE: Temperature/View/Home.swift ================================================ // // Home.swift // Temperature // // Created by vijay verma on 24/03/23. // This is testing out screen. Check Tube.swift for final code import SwiftUI struct Home: View { @State var maxHeight: CGFloat = UIScreen.main.bounds.height / 3 @State var progress: CGFloat = 0.5 @State var startAnimation: CGFloat = 0 @State var sliderHeight: CGFloat = 0 @State var sliderProgress: CGFloat = 0 @State var lastDragValue: CGFloat = 0 var body: some View { VStack{ // Mark: Wave Form GeometryReader{proxy in let size = proxy.size ZStack { WaterWaveS(progress: progress, waveHeight: 0.02, offset: startAnimation) .fill( LinearGradient(gradient: Gradient(colors: [ Color(UIColor(hex: "#EE3A32")), Color(UIColor(hex: "#EF803B")), Color(UIColor(hex: "#EBAC38")), Color(UIColor(hex: "#D7C05E")), Color(UIColor(hex: "#ABC770")), Color(UIColor(hex: "#55C1DC")), ]), startPoint: .top, endPoint: .bottom) ) .frame(width: 96, height: 456) .mask(RoundedRectangle(cornerRadius: 48)) //Water Drops shapes .overlay(content: { ZStack{ Circle() .fill(.white.opacity(0.1)) .frame(width: 15, height: 15) .offset(x: -20) Circle() .fill(.white.opacity(0.2)) .frame(width: 15, height: 15) .offset(x:40, y: 30) Circle() .fill(.white.opacity(0.2)) .frame(width: 25, height: 25) .offset(x: -30, y: 80) Circle() .fill(.white.opacity(0.2)) .frame(width: 10, height: 10) .offset(x: 40, y: 100) Circle() .fill(.white.opacity(0.2)) .frame(width: 20, height: 20) .offset(x: 50, y: 70) } }) //Masking in drop // .mask { // Image(systemName: "square.fill") // .resizable() // .renderingMode(.template) // .aspectRatio(contentMode: .fit) // .padding(20) // } // Add button .overlay(alignment: .bottom) { // Button{ // progress += 0.01 // } label: { // Image(systemName: "plus") // .font(.system(size: 40, weight: .black)) // .foregroundColor(Color(.blue)) // .shadow(radius: 2) // .padding(25) // .background(.white, in: Circle()) // } // .offset(y: 40) } } .frame(width: size.width, height: size.height, alignment: .center) .onAppear{ //Looping animation withAnimation(.easeInOut(duration: 0.8).repeatForever(autoreverses: false)){ //loop will not finish if staranimation will be larger than rect width startAnimation = size.width } } } VStack { // Slider... ZStack(alignment: .bottom, content: { Rectangle() .fill(Color(.gray).opacity(0.15)) Rectangle() .fill(Color.blue) .frame(height: sliderHeight) }) .frame(width: 120, height: maxHeight) .cornerRadius(32) .gesture(DragGesture(minimumDistance: 0).onChanged({ (value) in //getting dragvalue... let translation = value.translation sliderHeight = -translation.height + lastDragValue //Limiing slide height value sliderHeight = sliderHeight > maxHeight ? maxHeight : sliderHeight sliderHeight = sliderHeight >= 0 ? sliderHeight : 0 //updating progress let progres = sliderHeight / maxHeight sliderProgress = progres <= 1.0 ? progres : 1 }).onEnded({ (value) in // Storing las drag value for restorating sliderHeight = sliderHeight > maxHeight ? maxHeight : sliderHeight // Negative height... sliderHeight = sliderHeight >= 0 ? sliderHeight : 0 lastDragValue = sliderHeight })) .overlay( Text("\(Int(sliderProgress * 100))%") .fontWeight(.semibold) .foregroundColor(.black) .padding(.vertical, 10) .padding(.horizontal, 18) .background(.white) .cornerRadius(12) .padding(.vertical, 25) .offset(y: sliderHeight < maxHeight - 105 ? -sliderHeight : -maxHeight+105) ,alignment: .bottom ) } Slider(value: $progress) } .padding() .frame(minWidth: 0, maxWidth: .infinity) } } struct Home_Previews: PreviewProvider { static var previews: some View { Home() } } struct WaterWaveS: Shape{ var progress: CGFloat // Wave Height var waveHeight: CGFloat // Initial Animation Start var offset: CGFloat //Enabling animation var animatableData: CGFloat{ get{offset} set{offset = newValue} } func path(in rect: CGRect) -> Path { return Path{path in path.move(to: .zero) //Mark: Drawing Waves using Sine let progressHeight: CGFloat = (1 - progress) * rect.height let height = waveHeight * rect.height for value in stride(from: 0, through: rect.width, by: 1){ let x: CGFloat = value let sine: CGFloat = sin(Angle(degrees: value + offset).radians) // let sine: CGFloat = sin(1) let y: CGFloat = progressHeight + (height * sine) path.addLine(to: CGPoint(x: x, y: y)) } // Bottom Portion path.addLine(to: CGPoint(x: rect.width, y: rect.height)) path.addLine(to: CGPoint(x: 0, y: rect.height)) } } } ================================================ FILE: Temperature/View/Tube.swift ================================================ // // Tube.swift // Temperature // // Created by vijay verma on 24/03/23. // import SwiftUI struct Tube: View { @State var progress: CGFloat = 0.25 @State var startAnimation: CGFloat = 0 @State private var position = CGPoint(x: 100, y: 0) @State private var dragOffset = CGSize.zero let maskSize = CGSize(width: 122, height: 400) @State private var sliderValue = 0.5 @State var maxHeight: CGFloat = 420 //Slider properties @State var sliderHeight: CGFloat = 0 @State var sliderProgress: CGFloat = 0 @State var lastDragValue: CGFloat = 0 let menuItems = [ ("Menu 1", "cold"), ("Menu 2", "normal"), ("Menu 3", "fire") ] @State private var selectedMenuIndex = 1 @State private var backgroundColor = Color(UIColor(hex: "#A4FFEF")) // selected item index @State private var selectedMenu = 0 // slide background position @State private var backgroundOffset: CGFloat = 0 @State private var previousSelectedMenu = 0 var body: some View { ZStack { LinearGradient(gradient: Gradient(colors: [Color(red: 1.0, green: 1.0, blue: 1.0, opacity: 1), Color(red: 0.96, green: 0.96, blue: 0.97, opacity: 1)]), startPoint: .init(x: 0.5, y: 0.75), endPoint: .init(x: 1.0, y: 1.0)) .edgesIgnoringSafeArea(.all) GeometryReader{ proxy in let size = proxy.size ZStack { ZStack { ZStack(alignment: .top, content: { Text("\(Int((sliderProgress*(30))+20 ))") .fontWeight(.bold) .foregroundColor(Color(UIColor(hex: "#BFC7D7")).opacity(0.6)) .padding(.vertical, 10) .multilineTextAlignment(.trailing) .padding(.horizontal, 18) .font(.system(size: 120)) .cornerRadius(12) Text("°") .fontWeight(.regular) .foregroundColor(Color(UIColor(hex: "#BFC7D7")).opacity(0.6)) .padding(.vertical, 10) .padding(.horizontal, 18) .font(.system(size: 80)) .cornerRadius(12) .offset(x: 100) }) } .frame(width: size.width, height: size.height, alignment: .top) .offset(y: -10) //Marker ZStack(alignment: .bottom, content:{ Rectangle() .fill(Color(UIColor(hex: "#DFE5F1")).opacity(0.5)) .frame(width: 52, height: 430, alignment: .bottom) Rectangle() .fill(Color(UIColor(hex: "#A1A7B4")).opacity(0.8)) .frame(width: 52, height: sliderHeight, alignment: .bottom) }) .frame(width: 52, height: 430, alignment: .bottom) .mask(Image("mark-num")) .offset(x:-120) //Tube ZStack{ RoundedRectangle(cornerRadius: 20) .fill( LinearGradient(gradient: Gradient(colors: [ Color(UIColor(hex: "#EE3A32")), Color(UIColor(hex: "#EF803B")), Color(UIColor(hex: "#EBAC38")), Color(UIColor(hex: "#D7C05E")), Color(UIColor(hex: "#ABC770")), Color(UIColor(hex: "#55C1DC")), ]), startPoint: .top, endPoint: .bottom)) .frame(width: 50, height: 406) .mask(RoundedRectangle(cornerRadius: 48)) .blur(radius: 32) .opacity(0.8) .offset(x: -50, y: 0) RoundedRectangle(cornerRadius: 20) .fill( LinearGradient(gradient: Gradient(colors: [ Color(UIColor(hex: "#ECECEC")), Color(UIColor(hex: "#FFFFFF")), ]), startPoint: .top, endPoint: .bottom) ) .frame(width: 96, height: 456) .mask(RoundedRectangle(cornerRadius: 48)) .opacity(0.8) WaterWaveS(progress: sliderProgress, waveHeight: 0.04, offset: startAnimation+190) .fill( LinearGradient(gradient: Gradient(colors: [ Color(UIColor(hex: "#EE3A32")), Color(UIColor(hex: "#EF803B")), Color(UIColor(hex: "#EBAC38")), Color(UIColor(hex: "#D7C05E")), Color(UIColor(hex: "#ABC770")), Color(UIColor(hex: "#55C1DC")), ]), startPoint: .top, endPoint: .bottom) ) .frame(width: 96, height: 456) .mask(RoundedRectangle(cornerRadius: 48)) .overlay( Capsule() .stroke(Color(red: 236/255, green: 234/255, blue: 235/255), lineWidth: 1) .shadow(color: Color.black.opacity(0.7), radius: 10, x: 0, y: 0) .clipShape( Capsule() ) ) WaterWaveS(progress: sliderProgress, waveHeight: 0.04, offset: startAnimation) .fill( LinearGradient(gradient: Gradient(colors: [ Color(UIColor(hex: "#EE3A32")), Color(UIColor(hex: "#EF803B")), Color(UIColor(hex: "#EBAC38")), Color(UIColor(hex: "#D7C05E")), Color(UIColor(hex: "#ABC770")), Color(UIColor(hex: "#55C1DC")), ]), startPoint: .top, endPoint: .bottom) ) .frame(width: 96, height: 456) .mask(RoundedRectangle(cornerRadius: 48)) .opacity(0.5) RoundedRectangle(cornerRadius: 54) .strokeBorder( LinearGradient(gradient: Gradient(colors: [Color(red: 1.0, green: 1.0, blue: 1.0, opacity: 0.8), Color(red: 0.93, green: 0.94, blue: 0.97, opacity: 1)]), startPoint: .top, endPoint: .bottom) , lineWidth: 6) .frame(width: 108, height: 468) RoundedRectangle(cornerRadius: 20) .fill(.white) .frame(width: 26, height: 390) .mask(RoundedRectangle(cornerRadius: 48)) .blur(radius: 7) .opacity(0.5) .blendMode(.overlay) .offset(x: 16, y: 0) RoundedRectangle(cornerRadius: 20) .fill(.white) .frame(width: 12, height: 370) .mask(RoundedRectangle(cornerRadius: 48)) .blur(radius: 4) .opacity(0.3) .blendMode(.overlay) .offset(x: -24, y: 0) } .frame(width: size.width, height: size.height, alignment: .center) .onAppear{ //Looping animation withAnimation(.linear(duration: 0.7).repeatForever(autoreverses: false)){ //loop will not finish if staranimation will be larger than rect width startAnimation = size.width } } ZStack{ //Other stack for slider VStack { ZStack{ Rectangle() .fill(getModifiedColor(Color.teal)) .frame(height: 1000) .cornerRadius(10) .padding(8) Rectangle() .fill(.red) .frame(width: 100, height: 100) .blur(radius: 8) } .mask(Image("curve-nob")) .offset(x: -24, y: position.y + 210 - sliderHeight) } .frame(width: 200) .mask( LinearGradient(gradient: Gradient(colors: [.clear, .black, .black, .black, .clear]), startPoint: .top, endPoint: .bottom) .frame(height: maxHeight + 100) ) VStack { // Slider... ZStack(alignment: .bottom, content: { Rectangle() .fill(Color(.gray).opacity(0.01)) // - (maxheight - 48) //sliderHeight <= max ? -sliderHeight : -(sliderHeight - 48) }) .frame(width: 120, height: maxHeight) .cornerRadius(32) .gesture(DragGesture(minimumDistance: 0).onChanged({ (value) in //getting dragvalue... let translation = value.translation sliderHeight = -translation.height + lastDragValue //Limiing slide height value sliderHeight = sliderHeight > maxHeight ? maxHeight : sliderHeight sliderHeight = sliderHeight >= 0 ? sliderHeight : 0 //updating progress let progres = sliderHeight / maxHeight sliderProgress = progres <= 1.0 ? progres : 1 switch sliderProgress { case 0..<0.5: backgroundColor = Color(UIColor(hex: "#A4FFEF")) selectedMenu = 0 case 0.5..<0.8: backgroundColor = Color(UIColor(hex: "#FFEDAE")) selectedMenu = 1 default: backgroundColor = Color(UIColor(hex: "#FFC5C5")) selectedMenu = 2 } }).onEnded({ (value) in // Storing las drag value for restorating sliderHeight = sliderHeight > maxHeight ? maxHeight : sliderHeight // Negative height... sliderHeight = sliderHeight >= 0 ? sliderHeight : 0 lastDragValue = sliderHeight })) }.offset( y:0) VStack{ Image("nob") .resizable() .frame(width: 48, height: 48) .offset(x: 0, y: -sliderHeight ) } .frame(width: 120, height: maxHeight+48, alignment: .bottom) .zIndex(-1) } .frame(width: 200, height: 600) .offset(x: 130) } } VStack{ Spacer() HStack(spacing: 20) { MenuButton(imageName: "cold", label: "cold", isSelected: selectedMenu == 0) .scaleEffect(selectedMenu == 0 ? 1.2 : 1.0) // Scale up when selected .onTapGesture { backgroundColor = Color(UIColor(hex: "#A4FFEF")) previousSelectedMenu = selectedMenu sliderProgress = 0 withAnimation { self.selectedMenu = 0 } } MenuButton(imageName: "normal", label: "normal", isSelected: selectedMenu == 1) .scaleEffect(selectedMenu == 1 ? 1.2 : 1.0) // Scale up when selected .onTapGesture { backgroundColor = Color(UIColor(hex: "#FFEDAE")) previousSelectedMenu = selectedMenu sliderProgress = 0.5 withAnimation { self.selectedMenu = 1 } } MenuButton(imageName: "fire", label: "fire", isSelected: selectedMenu == 2) .scaleEffect(selectedMenu == 2 ? 1.2 : 1.0) // Scale up when selected .onTapGesture { backgroundColor = Color(UIColor(hex: "#FFC5C5")) previousSelectedMenu = selectedMenu sliderProgress = 1 withAnimation { self.selectedMenu = 2 } } } .background( GeometryReader { proxy in let iconWidth = CGFloat(60) // change this to the actual width of your icon let backgroundWidth = proxy.size.width / 3 let extraOffset = (proxy.size.width - backgroundWidth * 3 - 10) / 2 // calculate extra offset for first and last background let menuOffset = CGFloat(selectedMenu) * (backgroundWidth + 10) let centerOffset = (backgroundWidth - iconWidth) / 2 let leadingOffset = centerOffset + menuOffset + extraOffset * (selectedMenu == 0 ? -1 : selectedMenu == 2 ? 1 : 0) RoundedRectangle(cornerRadius: 30) .foregroundColor(backgroundColor) .frame(width: iconWidth, height: proxy.size.height) .offset(x: leadingOffset - 10) .blur(radius: 7) .animation(.easeInOut(duration: 0.3), value: selectedMenu) .opacity(0.5) .onTapGesture { withAnimation { self.selectedMenu = 2 } } } ) .frame(maxWidth: .infinity) .padding(.horizontal, 30) } .offset(y: -10) } } private func getModifiedColor(_ color: Color) -> Color { let teal = Color.teal let green = Color.green let yellow = Color.yellow let orange = Color.orange let red = Color.red switch sliderProgress { case 0..<0.125: return blendColors(teal, green, fraction: sliderProgress / 0.125) case 0.125..<0.25: return blendColors(green, yellow, fraction: (sliderProgress - 0.125) / 0.125) case 0.25..<0.5: return blendColors(yellow, orange, fraction: (sliderProgress - 0.25) / 0.25) case 0.5..<0.75: return blendColors(orange, red, fraction: (sliderProgress - 0.5) / 0.25) case 0.75...1: return red default: return color } } private func blendColors(_ color1: Color, _ color2: Color, fraction: Double) -> Color { let cgColor1 = color1.cgColor let cgColor2 = color2.cgColor guard let components1 = cgColor1?.components, let components2 = cgColor2?.components else { return color1 } let red = components1[0] * (1 - fraction) + components2[0] * fraction let green = components1[1] * (1 - fraction) + components2[1] * fraction let blue = components1[2] * (1 - fraction) + components2[2] * fraction let alpha = components1[3] * (1 - fraction) + components2[3] * fraction return Color(red: Double(red), green: Double(green), blue: Double(blue), opacity: Double(alpha)) } } struct Tube_Previews: PreviewProvider { static var previews: some View { Tube() } } struct MenuButton: View { var imageName: String var label: String var isSelected: Bool var body: some View { ZStack(alignment: .center, content:{ Image(imageName) //.foregroundColor(isSelected ? .blue : .gray) .frame(width: 48, height: 48) Rectangle() .fill(Color(UIColor(hex: "#BFC7D7")).opacity(isSelected ? 0.0 : 1.0)) .frame(width: 52, height: 430, alignment: .bottom) }) .mask(Image(imageName)) .frame(width: 48, height: 48) .padding(.horizontal, 10) .padding(.vertical, 10) } } ================================================ FILE: Temperature/WaterWave.swift ================================================ // // WaterWave.swift // Temperature // // Created by vijay verma on 24/03/23. // import SwiftUI struct WaterWave: View { @State private var waveOffset: CGFloat = 0 var body: some View { ZStack { LinearGradient(gradient: Gradient(colors: [.blue, .purple]), startPoint: .topLeading, endPoint: .bottomTrailing) .edgesIgnoringSafeArea(.all) Path { path in let width = UIScreen.main.bounds.width let height = UIScreen.main.bounds.height let midY = height / 2 let waveWidth = CGFloat(0.8) let xOffset = waveOffset * width path.move(to: CGPoint(x: 0, y: midY)) path.addLine(to: CGPoint(x: 0, y: height)) path.addLine(to: CGPoint(x: width, y: height)) path.addLine(to: CGPoint(x: width, y: midY)) path.addCurve(to: CGPoint(x: 0, y: midY), control1: CGPoint(x: width * waveWidth * 0.25 + xOffset, y: height * 0.75), control2: CGPoint(x: width * waveWidth * 0.75 + xOffset, y: height * 0.25)) } .fill(Color.white) .opacity(0.4) } .onAppear { withAnimation(Animation.linear(duration: 1).repeatForever()) { self.waveOffset = 1 } } } } struct WaterWave_Previews: PreviewProvider { static var previews: some View { WaterWave() } } ================================================ FILE: Temperature.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 56; objects = { /* Begin PBXBuildFile section */ 1E16F2DC29CCE1C900AC642B /* TemperatureApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F2DB29CCE1C900AC642B /* TemperatureApp.swift */; }; 1E16F2DE29CCE1C900AC642B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F2DD29CCE1C900AC642B /* ContentView.swift */; }; 1E16F2E029CCE1CA00AC642B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1E16F2DF29CCE1CA00AC642B /* Assets.xcassets */; }; 1E16F2E329CCE1CA00AC642B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1E16F2E229CCE1CA00AC642B /* Preview Assets.xcassets */; }; 1E16F2ED29CCE1CA00AC642B /* TemperatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F2EC29CCE1CA00AC642B /* TemperatureTests.swift */; }; 1E16F2F729CCE1CA00AC642B /* TemperatureUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F2F629CCE1CA00AC642B /* TemperatureUITests.swift */; }; 1E16F2F929CCE1CA00AC642B /* TemperatureUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F2F829CCE1CA00AC642B /* TemperatureUITestsLaunchTests.swift */; }; 1E16F30629CCE78400AC642B /* WaterWave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F30529CCE78400AC642B /* WaterWave.swift */; }; 1E16F32729CCFF6B00AC642B /* Home.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F32629CCFF6B00AC642B /* Home.swift */; }; 1E16F32929CE1F8000AC642B /* Tube.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F32829CE1F8000AC642B /* Tube.swift */; }; 1E16F32C29CE216D00AC642B /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E16F32B29CE216D00AC642B /* Extensions.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 1E16F2E929CCE1CA00AC642B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1E16F2D029CCE1C900AC642B /* Project object */; proxyType = 1; remoteGlobalIDString = 1E16F2D729CCE1C900AC642B; remoteInfo = Temperature; }; 1E16F2F329CCE1CA00AC642B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1E16F2D029CCE1C900AC642B /* Project object */; proxyType = 1; remoteGlobalIDString = 1E16F2D729CCE1C900AC642B; remoteInfo = Temperature; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 1E16F2D829CCE1C900AC642B /* Temperature.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Temperature.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1E16F2DB29CCE1C900AC642B /* TemperatureApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemperatureApp.swift; sourceTree = ""; }; 1E16F2DD29CCE1C900AC642B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 1E16F2DF29CCE1CA00AC642B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1E16F2E229CCE1CA00AC642B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 1E16F2E829CCE1CA00AC642B /* TemperatureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TemperatureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 1E16F2EC29CCE1CA00AC642B /* TemperatureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemperatureTests.swift; sourceTree = ""; }; 1E16F2F229CCE1CA00AC642B /* TemperatureUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TemperatureUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 1E16F2F629CCE1CA00AC642B /* TemperatureUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemperatureUITests.swift; sourceTree = ""; }; 1E16F2F829CCE1CA00AC642B /* TemperatureUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemperatureUITestsLaunchTests.swift; sourceTree = ""; }; 1E16F30529CCE78400AC642B /* WaterWave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaterWave.swift; sourceTree = ""; }; 1E16F32629CCFF6B00AC642B /* Home.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home.swift; sourceTree = ""; }; 1E16F32829CE1F8000AC642B /* Tube.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tube.swift; sourceTree = ""; }; 1E16F32B29CE216D00AC642B /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1E16F2D529CCE1C900AC642B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2E529CCE1CA00AC642B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2EF29CCE1CA00AC642B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1E16F2CF29CCE1C900AC642B = { isa = PBXGroup; children = ( 1E16F2DA29CCE1C900AC642B /* Temperature */, 1E16F2EB29CCE1CA00AC642B /* TemperatureTests */, 1E16F2F529CCE1CA00AC642B /* TemperatureUITests */, 1E16F2D929CCE1C900AC642B /* Products */, ); sourceTree = ""; }; 1E16F2D929CCE1C900AC642B /* Products */ = { isa = PBXGroup; children = ( 1E16F2D829CCE1C900AC642B /* Temperature.app */, 1E16F2E829CCE1CA00AC642B /* TemperatureTests.xctest */, 1E16F2F229CCE1CA00AC642B /* TemperatureUITests.xctest */, ); name = Products; sourceTree = ""; }; 1E16F2DA29CCE1C900AC642B /* Temperature */ = { isa = PBXGroup; children = ( 1E16F32A29CE213300AC642B /* Utilities */, 1E16F32529CCFF4700AC642B /* View */, 1E16F2DB29CCE1C900AC642B /* TemperatureApp.swift */, 1E16F30529CCE78400AC642B /* WaterWave.swift */, 1E16F2DD29CCE1C900AC642B /* ContentView.swift */, 1E16F2DF29CCE1CA00AC642B /* Assets.xcassets */, 1E16F2E129CCE1CA00AC642B /* Preview Content */, ); path = Temperature; sourceTree = ""; }; 1E16F2E129CCE1CA00AC642B /* Preview Content */ = { isa = PBXGroup; children = ( 1E16F2E229CCE1CA00AC642B /* Preview Assets.xcassets */, ); path = "Preview Content"; sourceTree = ""; }; 1E16F2EB29CCE1CA00AC642B /* TemperatureTests */ = { isa = PBXGroup; children = ( 1E16F2EC29CCE1CA00AC642B /* TemperatureTests.swift */, ); path = TemperatureTests; sourceTree = ""; }; 1E16F2F529CCE1CA00AC642B /* TemperatureUITests */ = { isa = PBXGroup; children = ( 1E16F2F629CCE1CA00AC642B /* TemperatureUITests.swift */, 1E16F2F829CCE1CA00AC642B /* TemperatureUITestsLaunchTests.swift */, ); path = TemperatureUITests; sourceTree = ""; }; 1E16F32529CCFF4700AC642B /* View */ = { isa = PBXGroup; children = ( 1E16F32629CCFF6B00AC642B /* Home.swift */, 1E16F32829CE1F8000AC642B /* Tube.swift */, ); path = View; sourceTree = ""; }; 1E16F32A29CE213300AC642B /* Utilities */ = { isa = PBXGroup; children = ( 1E16F32B29CE216D00AC642B /* Extensions.swift */, ); path = Utilities; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1E16F2D729CCE1C900AC642B /* Temperature */ = { isa = PBXNativeTarget; buildConfigurationList = 1E16F2FC29CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "Temperature" */; buildPhases = ( 1E16F2D429CCE1C900AC642B /* Sources */, 1E16F2D529CCE1C900AC642B /* Frameworks */, 1E16F2D629CCE1C900AC642B /* Resources */, ); buildRules = ( ); dependencies = ( ); name = Temperature; packageProductDependencies = ( ); productName = Temperature; productReference = 1E16F2D829CCE1C900AC642B /* Temperature.app */; productType = "com.apple.product-type.application"; }; 1E16F2E729CCE1CA00AC642B /* TemperatureTests */ = { isa = PBXNativeTarget; buildConfigurationList = 1E16F2FF29CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "TemperatureTests" */; buildPhases = ( 1E16F2E429CCE1CA00AC642B /* Sources */, 1E16F2E529CCE1CA00AC642B /* Frameworks */, 1E16F2E629CCE1CA00AC642B /* Resources */, ); buildRules = ( ); dependencies = ( 1E16F2EA29CCE1CA00AC642B /* PBXTargetDependency */, ); name = TemperatureTests; productName = TemperatureTests; productReference = 1E16F2E829CCE1CA00AC642B /* TemperatureTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 1E16F2F129CCE1CA00AC642B /* TemperatureUITests */ = { isa = PBXNativeTarget; buildConfigurationList = 1E16F30229CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "TemperatureUITests" */; buildPhases = ( 1E16F2EE29CCE1CA00AC642B /* Sources */, 1E16F2EF29CCE1CA00AC642B /* Frameworks */, 1E16F2F029CCE1CA00AC642B /* Resources */, ); buildRules = ( ); dependencies = ( 1E16F2F429CCE1CA00AC642B /* PBXTargetDependency */, ); name = TemperatureUITests; productName = TemperatureUITests; productReference = 1E16F2F229CCE1CA00AC642B /* TemperatureUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 1E16F2D029CCE1C900AC642B /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1420; LastUpgradeCheck = 1420; TargetAttributes = { 1E16F2D729CCE1C900AC642B = { CreatedOnToolsVersion = 14.2; }; 1E16F2E729CCE1CA00AC642B = { CreatedOnToolsVersion = 14.2; TestTargetID = 1E16F2D729CCE1C900AC642B; }; 1E16F2F129CCE1CA00AC642B = { CreatedOnToolsVersion = 14.2; TestTargetID = 1E16F2D729CCE1C900AC642B; }; }; }; buildConfigurationList = 1E16F2D329CCE1C900AC642B /* Build configuration list for PBXProject "Temperature" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 1E16F2CF29CCE1C900AC642B; packageReferences = ( ); productRefGroup = 1E16F2D929CCE1C900AC642B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 1E16F2D729CCE1C900AC642B /* Temperature */, 1E16F2E729CCE1CA00AC642B /* TemperatureTests */, 1E16F2F129CCE1CA00AC642B /* TemperatureUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1E16F2D629CCE1C900AC642B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E16F2E329CCE1CA00AC642B /* Preview Assets.xcassets in Resources */, 1E16F2E029CCE1CA00AC642B /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2E629CCE1CA00AC642B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2F029CCE1CA00AC642B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1E16F2D429CCE1C900AC642B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E16F30629CCE78400AC642B /* WaterWave.swift in Sources */, 1E16F32C29CE216D00AC642B /* Extensions.swift in Sources */, 1E16F32929CE1F8000AC642B /* Tube.swift in Sources */, 1E16F2DE29CCE1C900AC642B /* ContentView.swift in Sources */, 1E16F32729CCFF6B00AC642B /* Home.swift in Sources */, 1E16F2DC29CCE1C900AC642B /* TemperatureApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2E429CCE1CA00AC642B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E16F2ED29CCE1CA00AC642B /* TemperatureTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 1E16F2EE29CCE1CA00AC642B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1E16F2F729CCE1CA00AC642B /* TemperatureUITests.swift in Sources */, 1E16F2F929CCE1CA00AC642B /* TemperatureUITestsLaunchTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 1E16F2EA29CCE1CA00AC642B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 1E16F2D729CCE1C900AC642B /* Temperature */; targetProxy = 1E16F2E929CCE1CA00AC642B /* PBXContainerItemProxy */; }; 1E16F2F429CCE1CA00AC642B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 1E16F2D729CCE1C900AC642B /* Temperature */; targetProxy = 1E16F2F329CCE1CA00AC642B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 1E16F2FA29CCE1CA00AC642B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 1E16F2FB29CCE1CA00AC642B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.2; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; }; 1E16F2FD29CCE1CA00AC642B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Temperature/Preview Content\""; DEVELOPMENT_TEAM = 9GRRFW5PQZ; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.Temperature; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 1E16F2FE29CCE1CA00AC642B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Temperature/Preview Content\""; DEVELOPMENT_TEAM = 9GRRFW5PQZ; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.Temperature; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; 1E16F30029CCE1CA00AC642B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.2; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.TemperatureTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Temperature.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Temperature"; }; name = Debug; }; 1E16F30129CCE1CA00AC642B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.2; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.TemperatureTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Temperature.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Temperature"; }; name = Release; }; 1E16F30329CCE1CA00AC642B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.TemperatureUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Temperature; }; name = Debug; }; 1E16F30429CCE1CA00AC642B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = overlayz.studio.TemperatureUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Temperature; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1E16F2D329CCE1C900AC642B /* Build configuration list for PBXProject "Temperature" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E16F2FA29CCE1CA00AC642B /* Debug */, 1E16F2FB29CCE1CA00AC642B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1E16F2FC29CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "Temperature" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E16F2FD29CCE1CA00AC642B /* Debug */, 1E16F2FE29CCE1CA00AC642B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1E16F2FF29CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "TemperatureTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E16F30029CCE1CA00AC642B /* Debug */, 1E16F30129CCE1CA00AC642B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1E16F30229CCE1CA00AC642B /* Build configuration list for PBXNativeTarget "TemperatureUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( 1E16F30329CCE1CA00AC642B /* Debug */, 1E16F30429CCE1CA00AC642B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 1E16F2D029CCE1C900AC642B /* Project object */; } ================================================ FILE: Temperature.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: Temperature.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: Temperature.xcodeproj/xcshareddata/xcschemes/Temperature.xcscheme ================================================ ================================================ FILE: Temperature.xcodeproj/xcuserdata/vijayverma.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist ================================================ ================================================ FILE: Temperature.xcodeproj/xcuserdata/vijayverma.xcuserdatad/xcschemes/xcschememanagement.plist ================================================ SchemeUserState Temperature.xcscheme_^#shared#^_ orderHint 0 SuppressBuildableAutocreation 1E16F2D729CCE1C900AC642B primary 1E16F2E729CCE1CA00AC642B primary 1E16F2F129CCE1CA00AC642B primary ================================================ FILE: TemperatureTests/TemperatureTests.swift ================================================ // // TemperatureTests.swift // TemperatureTests // // Created by vijay verma on 24/03/23. // import XCTest @testable import Temperature final class TemperatureTests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } func testExample() throws { // This is an example of a functional test case. // Use XCTAssert and related functions to verify your tests produce the correct results. // Any test you write for XCTest can be annotated as throws and async. // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. } func testPerformanceExample() throws { // This is an example of a performance test case. self.measure { // Put the code you want to measure the time of here. } } } ================================================ FILE: TemperatureUITests/TemperatureUITests.swift ================================================ // // TemperatureUITests.swift // TemperatureUITests // // Created by vijay verma on 24/03/23. // import XCTest final class TemperatureUITests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. // In UI tests it is usually best to stop immediately when a failure occurs. continueAfterFailure = false // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. } override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } func testExample() throws { // UI tests must launch the application that they test. let app = XCUIApplication() app.launch() // Use XCTAssert and related functions to verify your tests produce the correct results. } func testLaunchPerformance() throws { if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { // This measures how long it takes to launch your application. measure(metrics: [XCTApplicationLaunchMetric()]) { XCUIApplication().launch() } } } } ================================================ FILE: TemperatureUITests/TemperatureUITestsLaunchTests.swift ================================================ // // TemperatureUITestsLaunchTests.swift // TemperatureUITests // // Created by vijay verma on 24/03/23. // import XCTest final class TemperatureUITestsLaunchTests: XCTestCase { override class var runsForEachTargetApplicationUIConfiguration: Bool { true } override func setUpWithError() throws { continueAfterFailure = false } func testLaunch() throws { let app = XCUIApplication() app.launch() // Insert steps here to perform after app launch but before taking a screenshot, // such as logging into a test account or navigating somewhere in the app let attachment = XCTAttachment(screenshot: app.screenshot()) attachment.name = "Launch Screen" attachment.lifetime = .keepAlways add(attachment) } }