Last active
February 20, 2020 00:07
-
-
Save DaisukeNagata/18ebf371216ec8649fed87f1f8ef650d to your computer and use it in GitHub Desktop.
SwiftUI_TabBar_CustomModal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://twitter.com/i/status/1230232397817556993