英文:
Changing appearance right after changing app language on fly causing problem in iOS using swift
问题
我在我的iOS应用中有两个选项,外观和更改语言(为阿拉伯语)。当您更改语言并尝试更改外观时,一些UI元素会恢复它们的方向,即从RTL到LTR。
我正在使用方法交换来更改应用程序语言,不想重新启动应用程序。我认为这是问题的原因。
以下是我如何更改UI外观的方式:
UIApplication.shared.windows.first?.overrideUserInterfaceStyle = theme.uiInterfaceStyle
注意:如果在更改语言后重新启动应用程序,更改外观可以正常工作。
英文:
I have both options Appearance and change Language (to Arabic) in my iOS app. When you change language and try to change appearance, some UI elements restores their direction i.e RTL to LTR
I'm doing method swizzling for changing app language, Don't want to restart the app. I think this is causing the problem.
Here is how i am changing ui appearance
UIApplication.shared.windows.first?.overrideUserInterfaceStyle = theme.uiInterfaceStyle
Note: If you restart the app after changing language, and change appearance work fine.
答案1
得分: 1
请查看以下链接:
https://betterprogramming.pub/ios-13-is-your-app-ready-for-the-dark-6aa73adec14b
let myDynamicColor = UIColor { (traitCollection: UITraitCollection) -> UIColor in
if traitCollection.userInterfaceStyle == .dark {
return UIColor(red: 0, green: 0, blue: 0, alpha: 1.0)
} else {
return UIColor(red: 220, green: 220, blue: 220, alpha: 1.0)
}
}
英文:
check this link
https://betterprogramming.pub/ios-13-is-your-app-ready-for-the-dark-6aa73adec14b
let myDynamicColor = UIColor { (traitCollection: UITraitCollection) -> UIColor in
if traitCollection.userInterfaceStyle == .dark {
return UIColor(red: 0, green: 0, blue: 0, alpha: 1.0)
} else {
return UIColor(red: 220, green: 220, blue: 220, alpha: 1.0)
}
}
答案2
得分: 1
我遇到了类似的问题。由于你正在操作UIWindow,所以在覆盖外观之后,它会恢复先前的方法交换。
你需要做的是再次调用更改语言的方法以使用当前选择/设置的语言。
英文:
I had a similar problem. Since you are messing up with the UIWindow, right after overriding appearance, it restores your previous method swizzling.
What you need to do is to call the change language method again to the currently selected/set language.
答案3
得分: 0
你可以在需要的屏幕上使用NSNotificationCenter和addObserver。当外观发生变化时,只需向所有屏幕发送通知,并使用addObserver方法刷新屏幕:
- (void)postNotificationDataChanged{
[[NSNotificationCenter defaultCenter] postNotificationName:AppearanceChanged object:nil userInfo:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:AppearanceChanged object:nil];
英文:
You can use NSNotificationCenter and addObserver in required screens.
Just send notification to all screens when appearance changed and refresh screen by addObserver method:
- (void)postNotificationDataChanged{
[[NSNotificationCenter defaultCenter] postNotificationName:AppearanceChanged object:nil userInfo:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:AppearanceChanged object:nil];
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论