SwiftUI 中的左右填充(不是前导和尾随)

Ste*_*e M 15 padding right-to-left ios swiftui

SwiftUI 中的填充修饰符采用EdgeInsets,例如

.padding(.leading, 8)

但是,只有前导和尾随 EdgeInsets,而不是左和右。这带来了一个问题,因为并非 RTL 语言中的所有内容都必须与 LTR 语言中的显示方式相反。

有没有办法实现与 padding 修饰符相同或相似的效果,无论语言的方向性如何,它都会强制填充位于左侧或右侧?

Asp*_*eri 14

这是可能方法的简化演示 - 使用在每一侧注入固定大小的扩展Spacer

使用 Xcode 13 / iOS 15 进行准备和测试

enum Side: Equatable, Hashable {
    case left
    case right
}

extension View {
    func padding(sides: [Side], value: CGFloat = 8) -> some View {
        HStack(spacing: 0) {
            if sides.contains(.left) {
                Spacer().frame(width: value)
            }
            self
            if sides.contains(.right) {
                Spacer().frame(width: value)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用演示

var body: some View {
  TextField("Last Name", text: $nameLast)
    .textFieldStyle(.roundedBorder)
    .padding(sides: [.left], value: 20)
}
Run Code Online (Sandbox Code Playgroud)

演示


Edi*_*Edi 11

对我来说是

VStack(alignment: .center) {
                    Text("Car")
                        .font(.body)
                        .foregroundColor(.black)
                }
                .padding(.trailing, 5)
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 9

用于@Environment(\\.layoutDirection)获取当前布局方向(LTR 或 RTL)并根据需要使用它来翻转.leading和。.trailing

\n

这里\xe2\x80\x99sViewModifier方便地包装了所有这些:

\n
enum NoFlipEdge {\n    case left, right\n}\n\nstruct NoFlipPadding: ViewModifier {\n    let edge: NoFlipEdge\n    let length: CGFloat?\n    @Environment(\\.layoutDirection) var layoutDirection\n    \n    private var computedEdge: Edge.Set {\n        if layoutDirection == .rightToLeft {\n            return edge == .left ? .trailing : .leading\n        } else {\n            return edge == .left ? .leading : .trailing\n        }\n    }\n    \n    func body(content: Content) -> some View {\n        content\n            .padding(computedEdge, length)\n    }\n}\n\nextension View {\n    func padding(_ edge: NoFlipEdge, _ length: CGFloat? = nil) -> some View {\n        self.modifier(NoFlipPadding(edge: edge, length: length))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

像使用标准填充修饰符一样使用它:

\n
Text("Text")\n    .padding(.left, 10)\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

struct ContentView: View {
var body: some View {
    Text("Hello, SwiftUI!")
        .padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)) // Apply custom padding values
}
Run Code Online (Sandbox Code Playgroud)

}