在SwiftUI中强制RTL或LTR

Sin*_*N75 4 ios swiftui

我知道SwiftUI会根据设备的系统语言来更改应用程序的方向。但是有没有办法忽略系统语言并强制应用始终为RTL或LTR?

Moj*_*ini 11

您可以将应用程序的默认语言设置为从右到左的某些语言,例如Persianininfo.plist或使用其他方法:

信息表


如果您需要强制视图,只需将此修饰符应用于您喜欢的任何视图:

.environment(\.layoutDirection, .rightToLeft)
Run Code Online (Sandbox Code Playgroud)

您可以申请ContentView()inSceneDelegate使其可用于所有子视图。


LuL*_*aGa 7

您可以在“场景代表”中设置布局方向:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        let contentView = ContentView().environment(\.layoutDirection, .rightToLeft)
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }
Run Code Online (Sandbox Code Playgroud)

或使用此修改器在某些视图上手动禁用方向更改:

.flipsForRightToLeftLayoutDirection(true)
Run Code Online (Sandbox Code Playgroud)

  • 不,它没有,但是当我在预览结构中添加相同的 ContentView().environment(\.layoutDirection, .rightToLeft) 时,它会发生。 (2认同)

iTa*_*rek 5

我尝试了一切方法来强制 SwiftUI 为 RTL 阿拉伯语,比如......

import SwiftUI

    @main
    struct MyApp: App {
        init() {
            UserDefaults.standard.set(["ar"], forKey: "AppleLanguages")
        }
        
        var body: some Scene {
            WindowGroup {
             
                ContentView()
                    .environment(\.locale, Locale(identifier: "ar"))
                    .environment(\.layoutDirection, .rightToLeft)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是如果你使用NavigationView,这种方式会导致很多错误最好的解决方案是......

import SwiftUI

    @main
    struct MyApp: App {
        init() {
            UserDefaults.standard.set(["ar"], forKey: "AppleLanguages")
        }
        
        var body: some Scene {
            WindowGroup {
             
                ContentView()
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)