ContentView.swift
//
// ContentView.swift
// Swiftuitest
//
// Created by Cairocoders
//
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
ScrollView {
MoviesCarousel(categoryName: "Top Movies")
}.navigationBarTitle("Browse", displayMode: .large)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
MoviesCarousel.swift
//
// MoviesCarousel.swift
// Swiftuitest
//
// Created by Cairocoders
//
import SwiftUI
struct MoviesCarousel: View {
let categoryName: String
var body: some View {
VStack {
HStack {
Text(categoryName)
.font(.system(size: 14, weight: .heavy))
.padding(.vertical, 6)
.padding(.horizontal, 12)
.background(Color.green)
.foregroundColor(.white)
.cornerRadius(2)
Spacer()
}.padding(.horizontal)
.padding(.top)
ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .top, spacing: 16) {
ForEach(latestmovie) { num in
GeometryReader { proxy in
let scale = getScale(proxy: proxy)
NavigationLink(
destination: MovieDetailsView(movie: num),
label: {
VStack(spacing: 8) {
Image(num.imageName)
.resizable()
.scaledToFill()
.frame(width: 180)
.clipped()
.cornerRadius(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color(white: 0.4))
)
.shadow(radius: 3)
Text(num.title)
.font(.system(size: 16, weight: .semibold))
.multilineTextAlignment(.center)
.foregroundColor(.black)
HStack(spacing: 0) {
ForEach(0..<5) { num in
Image(systemName: "star.fill")
.foregroundColor(.orange)
.font(.system(size: 14))
}
}.padding(.top, -4)
}
})
.scaleEffect(.init(width: scale, height: scale))
//.animation(.spring(), value: 1)
.animation(.easeOut(duration: 1))
.padding(.vertical)
} //End Geometry
.frame(width: 125, height: 400)
.padding(.horizontal, 32)
.padding(.vertical, 32)
} //End ForEach
Spacer()
.frame(width: 16)
} //End HStack
}// End ScrollView
}//End VStack
}
func getScale(proxy: GeometryProxy) -> CGFloat {
let midPoint: CGFloat = 125
let viewFrame = proxy.frame(in: CoordinateSpace.global)
var scale: CGFloat = 1.0
let deltaXAnimationThreshold: CGFloat = 125
let diffFromCenter = abs(midPoint - viewFrame.origin.x - deltaXAnimationThreshold / 2)
if diffFromCenter < deltaXAnimationThreshold {
scale = 1 + (deltaXAnimationThreshold - diffFromCenter) / 500
}
return scale
}
}
struct MoviesCarousel_Previews: PreviewProvider {
static var previews: some View {
MoviesCarousel(categoryName: "Top Movie")
}
}
MovieDetailsView.swift
//
// MovieDetailsView.swift
// Swiftuitest
//
// Created by Cairocoders
//
import SwiftUI
struct MovieDetailsView: View {
let movie: Movie
var body: some View {
Image(movie.imageName)
.resizable()
.scaledToFill()
.navigationTitle(movie.title)
}
}
struct MovieDetailsView_Previews: PreviewProvider {
static var previews: some View {
MovieDetailsView(movie: Movie(id: 1, title: "Avengers", imageName: "1"))
}
}
Model.swift
//
// Model.swift
// Swiftuitest
//
// Created by Cairocoders
//
import SwiftUI
struct Movie : Identifiable {
var id : Int
var title : String
var imageName : String
}
var latestmovie = [Movie(id: 0, title: "The Avengers", imageName: "1"),
Movie(id: 1, title: "Onward", imageName: "2"),
Movie(id: 2, title: "Soul", imageName: "3"),
Movie(id: 3, title: "Cruella", imageName: "4"),
Movie(id: 4, title: "Jungle Cruise", imageName: "5"),
Movie(id: 5, title: "The Call of the wild", imageName: "6"),
Movie(id: 6, title: "Joker", imageName: "7"),
Movie(id: 7, title: "Mulan", imageName: "8"),
Movie(id: 8, title: "Mortal Kombat", imageName: "9")]
