| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- //
- // TappablePadding.swift
- // ark_ui_basic_extension
- import Foundation
- // FIXME: import ark_ui_basic
- #if canImport(SwiftUI)
- public import SwiftUI
- struct TappablePadding: ViewModifier {
- let edges: Edge.Set
- let insets: EdgeInsets?
-
- let perform: () -> Void
-
- init(edges: Edge.Set = .all, insets: EdgeInsets?, perform: @escaping () -> Void) {
- self.edges = edges
- self.insets = insets
- self.perform = perform
- }
-
- private var insetsValue: EdgeInsets {
- EdgeInsets(
- top: edges.contains(.top) ? insets?.top ?? .zero : .zero,
- leading: edges.contains(.leading) ? insets?.leading ?? .zero : .zero,
- bottom: edges.contains(.bottom) ? insets?.bottom ?? .zero : .zero,
- trailing: edges.contains(.trailing) ? insets?.trailing ?? .zero : .zero
- )
- }
- func body(content: Content) -> some View {
- content
- .padding(insetsValue)
- .contentShape(Rectangle())
- .onTapGesture(perform: perform)
- .padding(insetsValue.inverted)
- }
- }
- extension EdgeInsets {
- var inverted: EdgeInsets {
- .init(top: -top, leading: -leading, bottom: -bottom, trailing: -trailing)
- }
-
- init(_all all: CGFloat) {
- self.init(top: all, leading: all, bottom: all, trailing: all)
- }
- }
- extension View {
- public func tappablePadding(
- _ insets: EdgeInsets,
- perform: @escaping () -> Void
- ) -> some View {
- modifier(TappablePadding(insets: insets, perform: perform))
- }
-
- public func tappablePadding(
- _ edges: Edge.Set = .all,
- _ length: CGFloat?,
- perform: @escaping () -> Void
- ) -> some View {
- let insets = length.map { EdgeInsets(_all: $0) }
- return modifier(TappablePadding(edges: edges, insets: insets, perform: perform))
- }
-
- public func tappablePadding(
- _ length: CGFloat,
- perform: @escaping () -> Void
- ) -> some View {
- tappablePadding(.all, length, perform: perform)
- }
- }
- @available(iOS 15, macOS 12, *)
- #Preview {
- HStack(spacing: 20) {
- Text("Test 1")
- .background { Color.yellow }
- .padding(EdgeInsets())
- .tappablePadding(.all, 20.0) {
- print("Test 1")
- }
- Text("Test 2")
- .background { Color.red }
- .onTapGesture {
- print("Test 2")
- }
- }
- .padding(20)
- .background { Color.blue }
- }
- #endif
|