Skip to content

Instantly share code, notes, and snippets.

@DaisukeNagata
Last active February 20, 2020 00:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DaisukeNagata/18ebf371216ec8649fed87f1f8ef650d to your computer and use it in GitHub Desktop.
Save DaisukeNagata/18ebf371216ec8649fed87f1f8ef650d to your computer and use it in GitHub Desktop.
SwiftUI_TabBar_CustomModal
import SwiftUI
class ViewRouter: ObservableObject {
@Published var currentView = "clock.fill"
@Published var flg = false
}
struct ContentView: View {
@ObservedObject var viewRouter = ViewRouter()
@State private var selection: Int = 1
var body: some View {
GeometryReader { geometry in
VStack {
Spacer()
if self.selection == 2 {
Text("Hello, World!").onTapGesture {
self.viewRouter.flg.toggle()
}
} else {
}
Spacer()
HStack {
self.modifier(TabModifier(text: "arrow.up.right.video.fill", selection: self.$selection, viewRouter: self.viewRouter, tag: 1))
self.modifier(TabModifier(text: "icloud.and.arrow.up.fill", selection: self.$selection,viewRouter: self.viewRouter, tag: 2))
self.modifier(TabModifier(text: "lock.icloud.fill", selection: self.$selection, viewRouter: self.viewRouter, tag: 3))
self.modifier(TabModifier(text: "message.fill", selection: self.$selection,viewRouter: self.viewRouter, tag: 4))
}
.frame(width: geometry.size.width, height: geometry.size.height/10)
}
AlertView()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct AlertView: View {
@State private var offSet: CGFloat = 1000
@ObservedObject var viewRouter = ViewRouter()
var body: some View {
GeometryReader { geometry in
Text("CustomDialog").frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.onTapGesture {
withAnimation {
self.viewRouter.flg.toggle()
}
}
ZStack {
if self.viewRouter.flg {
Color.gray
.frame(minWidth: 0, maxWidth: self.viewRouter.flg ? .infinity : 0 , minHeight: 0, maxHeight: self.viewRouter.flg ? .infinity : 0)
.opacity(0.6)
.edgesIgnoringSafeArea(.all)
Color.white
.frame(width: geometry.size.width, height: geometry.size.height/1.2, alignment: .center)
.cornerRadius(10, corners: [.topLeft, .topRight])
.padding(.top, geometry.size.height/5)
.offset(y: self.offSet)
.onTapGesture {
withAnimation(.linear(duration: 0.4)) {
self.offSet += CGFloat(1000)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.viewRouter.flg.toggle()
}
}
}
.onAppear {
withAnimation(.linear(duration: 0.4)) {
// select offSet
self.offSet = CGFloat(400)
}
}
}
}
}
}
}
struct TabModifier: ViewModifier {
var text: String? = ""
let selection: Binding<Int>
var viewRouter: ViewRouter
var tag: Int
var width = UIScreen.main.bounds.width
func body(content: Content) -> some View {
return GeometryReader { geometry in
VStack {
if self.tag == 1 {
Divider()
.frame(width: self.width, alignment: .bottom).offset(y: -8)
}
}
HStack {
Image(systemName: self.text ?? "")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: geometry.size.width, height: self.width/4 - 20)
.foregroundColor(self.fgColor())
.onTapGesture {
self.selection.wrappedValue = self.tag
self.viewRouter.currentView = self.text ?? ""
}
}
}
}
private func fgColor() -> Color {
return selection.wrappedValue == self.tag ? Color(UIColor.systemBlue) : Color(UIColor.systemGray)
}
}
struct HiddenModifier: ViewModifier {
fileprivate let isHidden: Bool
fileprivate func body(content: Content) -> some View {
Group {
if isHidden {
content.hidden()
} else {
content
}
}
}
}
extension View {
func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View {
clipShape( RoundedCorner(radius: radius, corners: corners) )
}
}
struct RoundedCorner: Shape {
var radius: CGFloat = .infinity
var corners: UIRectCorner = .allCorners
func path(in rect: CGRect) -> Path {
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
return Path(path.cgPath)
}
}
@DaisukeNagata
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment