博客主页
标签

swift

下的文章

Count:

计 4 篇
5
【swift】让你的 App 轻松支持多语言
【swift】让你的 App 轻松支持多语言
分类: 技术
简介:一、什么是本地化(Localization)本地化(Localization) 是指让应用程序能够根据用户的语言和地区自动显示相应的内容。例如:中文用户看到「登录」英文用户看到「Login」日语用户看到「ログイン」在 Swift / iOS 开发中,本地化字符串通常通过 NSLocalizedString 实现。二、NSLocalizedString 的基本用法最基础的语法如下:NSLocalizedString("Login", comment: "登录按钮标题")"Login" 是字符串键(key)"登录按钮标题" 是注释(供翻译人员理解使用,不会显示在界面上)系统会自动根据当前语言环境,在对应的 .strings 文件中查找该 key 的翻译。三、创建 Localizable.strings 文件在 Xcode 中选择:File → New → File → Strings File命名为 Localizable.strings选中文件 → 在右侧的 File Inspector 中点击 Localize...选择要支持的语言,例如:EnglishChinese (Simplified)Japanese这样 Xcode 会自动为每种语言生成一个对应目录:en.lproj/Localizable.strings zh Hans.lproj/Localizable.strings ja.lproj/Localizable.strings四、在 .strings 文件中添加内容示例:英文版 (en.lproj/Localizable.strings)"Login" = "Login"; "Email" = "Email"; "Password" = "Password";中文版 (zh Hans.lproj/Localizable.strings)"Login" = "登录"; "Email" = "邮箱"; "Password" = "密码";日文版 (ja.lproj/Localizable.strings)"Login" = "ログイン"; "Email" = "メール"; "Password" = "パスワード";五、在 Swift 中使用本地化字符串直接调用:Text(NSLocalizedString("Login", comment: "登录按钮标题"))或者用在控制器里:title = NSLocalizedString("Settings", comment: "设置页标题")六、优化写法:字符串扩展(推荐 ✅)在项目中频繁使用 NSLocalizedString 会显得冗长,我们可以通过 String 扩展 提供更简洁的写法:extension String { /// 快速返回本地化后的字符串 var LocalizedStr: String { return NSLocalizedString(self, comment: "") } }使用方式更优雅:Text("Login".LocalizedStr) TextField("Email".LocalizedStr, text: $email)✨ 优点:代码更简洁可读性更高不需要重复填写注释参数七、带格式的本地化字符串有时我们需要插入变量,例如:let name = "小明" Text(String(format: NSLocalizedString("Hello, %@!", comment: "问候语"), name)).strings 文件中对应:"Hello, %@!" = "你好,%@!";这样不同语言都能保持正确语法结构。八、支持动态语言切换(可选进阶)如果希望用户能在 App 内切换语言(不依赖系统设置),可以使用第三方库(如 Localize Swift)或自定义本地化管理器。例如:Localize.setCurrentLanguage("zh Hans")然后重新刷新视图即可。九、常见问题总结问题原因解决方法翻译没显示没有在对应 .lproj 文件添加 key检查字符串文件是否同步中文正常,英文不显示没设置英文语言资源在 Localizable.strings(en) 中补充内容注释出现在界面上写错了参数位置确保 comment 不在显示文本位置新增语言没生效没勾选 Localize 文件右键 Localizable.strings → Localize...🔚 十、总结Swift 本地化流程图:代码调用 → NSLocalizedString(key) → 查找系统语言目录 → 对应的 Localizable.strings → 返回翻译结果最佳实践:所有用户可见文字均通过 NSLocalizedString 处理;使用 .LocalizedStr 扩展简化调用;为每个字符串添加清晰注释;测试多语言切换场景,确保排版和长度兼容。
58
【swift】SwiftUI 动画
【swift】SwiftUI 动画
分类: 技术
简介:🔹 SwiftUI 动画SwiftUI 提供声明式动画,核心就是 .animation 修饰符和 withAnimation。1. 隐式动画(Implicit Animation)只要状态值发生变化,UI 会自动过渡。struct ImplicitAnimationView: View { @State private var isScaled = false var body: some View { VStack { Circle() .fill(Color.blue) .frame(width: isScaled ? 200 : 100, height: isScaled ? 200 : 100) .animation(.easeInOut(duration: 1), value: isScaled) // 隐式动画 Button("切换") { isScaled.toggle() } } } }2. 显式动画(Explicit Animation)用 withAnimation { ... } 包裹状态变化。struct ExplicitAnimationView: View { @State private var isRotated = false var body: some View { VStack { Rectangle() .fill(Color.red) .frame(width: 100, height: 100) .rotationEffect(.degrees(isRotated ? 180 : 0)) Button("旋转") { withAnimation(.spring(response: 0.5, dampingFraction: 0.4)) { isRotated.toggle() } } } } }3. 过渡动画(Transition Animation)针对视图的 插入和删除。struct TransitionAnimationView: View { @State private var showBox = false var body: some View { VStack { if showBox { Rectangle() .fill(Color.green) .frame(width: 150, height: 150) .transition(.scale) // 进入/退出动画 } Button("切换") { withAnimation(.easeInOut) { showBox.toggle() } } } } }4. 动画修饰器(Animation Modifier)绑定到某个值,值变化时触发动画。struct AnimationModifierView: View { @State private var offsetX: CGFloat = 0 var body: some View { Circle() .frame(width: 80, height: 80) .offset(x: offsetX) .onTapGesture { offsetX = offsetX == 0 ? 200 : 0 } .animation(.easeInOut(duration: 1), value: offsetX) // 绑定值 } }🔹 UIKit 动画在 UIKit 里,主要靠 UIView.animate 和 核心动画(Core Animation)。1. UIView.animateUIView.animate(withDuration: 0.5, animations: { someView.alpha = 0.0 someView.frame.origin.y += 100 }) { finished in print("动画完成") }2. 弹簧动画UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: [], animations: { someView.transform = CGAffineTransform(scaleX: 2, y: 2) }, completion: nil)3. 核心动画(CAAnimation)适合更复杂的场景。let animation = CABasicAnimation(keyPath: "position.x") animation.fromValue = 0 animation.toValue = 200 animation.duration = 1.0 someView.layer.add(animation, forKey: "moveX")总结SwiftUI → 用 .animation、withAnimation、transition。UIKit → 用 UIView.animate、UIViewPropertyAnimator、CAAnimation。
44
【swift】通用获取当前系统的语言
【swift】通用获取当前系统的语言
分类: 技术
简介:LanguageHelper.swift import Foundation struct LanguageHelper { /// 获取当前系统语言代码 (ISO 639 1) static func currentLanguageCode() > String { return Locale.current.language.languageCode?.identifier ?? "未知" } /// 获取当前系统地区 (ISO 3166 1) static func currentRegionCode() > String { return Locale.current.region?.identifier ?? "未知" } /// 获取 App 首选语言(取决于 Info.plist 里配置的 Localizations) static func appPreferredLanguage() > String { return Bundle.main.preferredLocalizations.first ?? "未知" } /// 获取系统语言优先级列表 static func systemPreferredLanguages() > [String] { return Locale.preferredLanguages } /// 打印常用信息 static func debugPrintLanguages() { print("🌐 系统语言代码: \(currentLanguageCode())") print("📍 系统地区代码: \(currentRegionCode())") print("📱 App 首选语言: \(appPreferredLanguage())") print("🗂 系统语言优先级列表: \(systemPreferredLanguages())") } } 调用 LanguageHelper.debugPrintLanguages() // 也可以单独调用 let lang = LanguageHelper.currentLanguageCode() let region = LanguageHelper.currentRegionCode()
49
【swift】使用UTC时区
【swift】使用UTC时区
分类:
简介:解释TimeZone(secondsFromGMT: 0) 代表 相对于格林威治时间 (GMT) 偏移 0 秒,也就是 UTC 时区。举例let date = Date() // 假设现在是北京时间 18:00 (GMT+8) // 默认情况下,格式化器会用本地时区 (GMT+8) let localFormatter = DateFormatter() localFormatter.dateFormat = "yyyy MM dd HH:mm:ss" print(localFormatter.string(from: date)) // 输出: 2025 09 17 18:00:00 // 如果强制用 UTC (GMT+0) let utcFormatter = DateFormatter() utcFormatter.dateFormat = "yyyy MM dd HH:mm:ss" utcFormatter.timeZone = TimeZone(secondsFromGMT: 0) print(utcFormatter.string(from: date)) // 输出: 2025 09 17 10:00:00你会发现,同一个 Date,在本地时区是 18:00,但在 UTC 时区会显示 10:00。
博客主页 数据猫 漫游于星空的数据猫
技术支持 CC 数据猫. 2025
打赏图
打赏博主
欢迎
欢迎
欢迎访问数据猫
搜 索
足 迹
分 类
  • 简文
  • 技术
  • 娱乐