Skip to content

Instantly share code, notes, and snippets.

@Kievkao
Created September 9, 2020 06:36
Show Gist options
  • Save Kievkao/5c27821505be656114e7734858ebf659 to your computer and use it in GitHub Desktop.
Save Kievkao/5c27821505be656114e7734858ebf659 to your computer and use it in GitHub Desktop.
SwiftUI - Conditional view modifiers
struct SwiftUIView: View {
var condition1: Bool = true
var condition2: Bool = false
var customColor: Color?
var body: some View {
Text("Hello, World!")
.ifLet(customColor) { $0.foregroundColor($1) }
.if(condition1) { $0.padding(16) }
.if(condition2) { $0.hidden() }
.if(condition1, if: { $0.padding(8) }, else: { $0.padding(16) })
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
}
extension View {
@ViewBuilder
func `if`<Transform: View>(
_ condition: Bool,
transform: (Self) -> Transform
) -> some View {
if condition {
transform(self)
} else {
self
}
}
@ViewBuilder
func `if`<TrueContent: View, FalseContent: View>(
_ condition: Bool,
if ifTransform: (Self) -> TrueContent,
else elseTransform: (Self) -> FalseContent
) -> some View {
if condition {
ifTransform(self)
} else {
elseTransform(self)
}
}
@ViewBuilder
func ifLet<V, Transform: View>(
_ value: V?,
transform: (Self, V) -> Transform
) -> some View {
if let value = value {
transform(self, value)
} else {
self
}
}
@ViewBuilder
func ignoreKeyboard() -> some View {
if #available(iOS 14.0, *) {
ignoresSafeArea(.keyboard)
} else {
self // iOS 13 always ignores the keyboard
}
}
@ViewBuilder
func insetGroupedListStyle() -> some View {
if #available(iOS 14.0, *) {
self.listStyle(InsetGroupedListStyle())
} else {
self
.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment