代码编织梦想

一、前言

  • 在 iOS 16 中,Apple 引入了三种新的宽度样式字体到 SF 字体库:Compressed、Condensed、Expend,展示效果如下:

在这里插入图片描述

二、UIFont.Width

  • Apple 引入了新的结构体 UIFont.Width,这代表了一种新的宽度样式。目前已有的四种样式:
    • standard:总是使用的默认宽度;
    • compressed:最窄的宽度样式;
    • condensed:介于压缩和标准之间的宽度样式;
    • expanded:最宽的宽度样式。
  • 其效果如下:

在这里插入图片描述

三、SF 字体和新的宽度样式

  • 如何将 SF 字体和新的宽度样式一起使用呢?为了使用新的宽度样式,Apple 有一个新的 UIFont 的类方法来接收新的 UIFont.Width:
class UIFont : NSObject {
    class func systemFont(
        ofSize fontSize: CGFloat,
        weight: UIFont.Weight,
        width: UIFont.Width
    ) -> UIFont
}
  • 可以像平常创建字体那样来使用新的方法:
let condensed = UIFont.systemFont(ofSize: 46, weight: .bold, width: .condensed)
let compressed = UIFont.systemFont(ofSize: 46, weight: .bold, width: .compressed)
let standard = UIFont.systemFont(ofSize: 46, weight: .bold, width: .standard)
let expanded = UIFont.systemFont(ofSize: 46, weight: .bold, width: .expanded)

四、SwiftUI 如何使用新宽度样式?

  • 在 Xcode 14.1 中,SwiftUI 提供了两个新的 API 设置这种新的宽度样式:width(😃 和 fontWidth(😃。目前(Xcode 16 beta 6),这种新的宽度样式和初始值设定只能在 UIKit 中使用,幸运的是,可以在 SwiftUI 中轻松的使用它。
  • 有很多种方法可以将 UIKit 集成到 SwiftUI,接下来展示在 SwiftUI 中使用新宽度样式的两种方法:
    • 将 UIfont 转为 Font;
    • 创建 Font 扩展。

① 将 UIFont 转为 Font

  • 我们知道,将 UIFont 转换到字体,可以使用 init(_ font: CTFont) 初始化器将 UIKit UIFont 转换为 SwiftUI Font。初始化器接收 CTFont 作为参数,CTFont 是一种不透明的类型,代表字体对象。
  • NSFont 和 UIFont 都可以自由与 CTFont 连接,如下是将 UIKit UIFont 转换为 SwiftUI Font 示例:
let uiFont = UIFont.systemFont(ofSize: 18, weight: .bold) 	
let font = Font(uiFont)
  • 至于如何将字体转换到 UIFont 呢?虽然可以轻松地将 UIFont 转换为 Font,但是不能反过来,因为 UIFont 比 Font 包含更多的灵活性和方法,可以用 Font 做的任何事情,都可能在 UIFont 中找到一种等效的方法。
  • 因此,Font 有初始化方法可以接收 UIFont 作为参数,创建带有新宽度样式的 UIFont,用 UIFont 初始化 Font, 然后传递给 .font 修改。步骤如下:
    • 需要创建一个带有新宽度样式的 UIFont;
    • 使用该 UIFont 创建一个 Font;
    • 然后像普通 Font 一样使用它们。
struct NewFontExample: View {
    let condensed = UIFont.systemFont(ofSize: 46, weight: .bold, width: .condensed)
    let compressed = UIFont.systemFont(ofSize: 46, weight: .bold, width: .compressed)
    let standard = UIFont.systemFont(ofSize: 46, weight: .bold, width: .standard)
    let expanded = UIFont.systemFont(ofSize: 46, weight: .bold, width: .expanded)
    
    var body: some View {
        VStack {
            Text("Compressed")
                .font(Font(compressed))
            Text("Condensed")
                .font(Font(condensed))
            Text("Standard")
                .font(Font(standard))
            Text("Expanded")
                .font(Font(expanded))
        }
    }
}

② 创建一个 Font 扩展

  • 这种方法实际上和将 UIfont 转为 Font 是同一种方法,只需要创建一个新的 Font 扩展在 SwiftUI 中使用起来更容易一些:
extension Font {
    public static func system(
        size: CGFloat,
        weight: UIFont.Weight,
        width: UIFont.Width) -> Font
    {
        // 1
        return Font(
            UIFont.systemFont(
                ofSize: size,
                weight: weight,
                width: width)
        )
    }
}
  • 创建一个静态函数传递 UIFont 需要的参数,然后初始化 UIFont 和创建 Font,就可以像这样使用:
Text("Compressed")
    .font(.system(size: 46, weight: .bold, width: .compressed))
Text("Condensed")
    .font(.system(size: 46, weight: .bold, width: .condensed))
Text("Standard")
    .font(.system(size: 46, weight: .bold, width: .standard))
Text("Expanded")
    .font(.system(size: 46, weight: .bold, width: .expanded))

③ 如何使用新的宽度样式?

  • 可以在想使用的任何地方使用,不会有任何限制,所有的新宽度都有一样的尺寸,同样的高度,只会有宽度的变化。
  • 如下是拥有同样文本,同样字体大小和同样字体样式的不同字体宽度样式展示:

在这里插入图片描述

④ 新的宽度样式优点

  • 可以使用新的宽度样式在已经存在的字体样式上,比如 thin 或者 bold ,在 App 上创造出独一无二的体验。Apple 将它使用在他们的照片app ,在 "回忆’’ 功能中,通过组合不同的字体宽度和样式在标题或者子标题上:

在这里插入图片描述

  • 如下有一些不同宽度和样式的字体组合:
Text("Pet Friends")
    .font(Font(UIFont.systemFont(ofSize: 46, weight: .light, width: .expanded)))
Text("OVER THE YEARS")
    .font(Font(UIFont.systemFont(ofSize: 30, weight: .thin, width: .compressed)))

Text("Pet Friends")
    .font(Font(UIFont.systemFont(ofSize: 46, weight: .black, width: .condensed)))
Text("OVER THE YEARS")
    .font(Font(UIFont.systemFont(ofSize: 20, weight: .light, width: .expanded)))

在这里插入图片描述

  • 也可以用新的宽度样式来控制文本的可读性,如所示,说明了不同宽度样式如何影响每行的字符数和段落长度:

在这里插入图片描述

五、下载字体

  • 可以在 Apple 字体平台来下载这种新的字体宽度样式,下载安装后,将会发现一种结合了现有宽度和新宽度样式的新样式:

在这里插入图片描述

  • 需要注意的是,基本上除了在模拟器的模拟系统 UI 中,在任何地方都被禁止使用 SF 字体,因此需要确保在使用前阅读并理解许可证。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Forever_wj/article/details/127972414

【译】Fucking SwiftUI-爱代码爱编程

原文:Fucking Swift UI - Cheat Sheet 译者的话:翻译过程中,发现了原文中的几个错误,我向作者@sarunw提出意见后,直接在译文中改掉了,如果您发现文中内容有误,欢迎与我联系。 关于 SwiftUI,您在下文中看到的所有答案并不是完整详细的,它只能充当一份备忘单,或是检索表。 常见问题 关于 SwiftUI 的

swiftui_设计师应该关心SwiftUI-爱代码爱编程

swiftui Since quarantine hit, I have been tinkering with SwiftUI. Over the past couple of weeks, I studied through the official documentation and watched WWDC 2019

swiftui_如何在swiftui中向图像添加通知标签-爱代码爱编程

swiftui SwiftUI (SwiftUI) SwiftUI is an innovative, easy way to build user interfaces across every Apple platform. Develop user interfaces for any of Apple’s

深度式睡眠潜入虚拟世界_潜入swiftui的惊人世界-爱代码爱编程

深度式睡眠潜入虚拟世界 介绍: (Introduction:) SwiftUI is the most exciting news since Apple has announced Swift in 2014. It’s an enormous step towards Apple’s goal of gett

从实际问题看 SwiftUI 和 Widget 编程-爱代码爱编程

Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者 | PJHubs 来源 | http://pjhubs.com/,点击阅读原文查看作者更多文章 前言 iOS14 的 Widget 和 iOS14 之前的 Widget

SwiftUI学习记录-爱代码爱编程

快捷键 资源库:⌘+⇧+L 布局和堆栈 默认情况下,图像不可调整大小 需要添加一个名为resizable的修饰符(在Modifiers里查找) 增大间距 添加间隙: Views里的spacer框架默认最大(占满整个屏幕),可以自己去inspector里调整Frame Frame过大导致有空隙(如下图)         

SwiftUI 动画进阶 — Part 5:Canvas-爱代码爱编程

这个高级SwiftUI动画系列的第五部分将探索Canvas视图。从技术上讲,它不是一个动画视图,但当它与第四部分的 TimelineView 结合时,它带来了很多有趣的可能性,正如这个数字雨的例子所示。 我不得不把这篇文章推迟几周,因为 Canvas 视图有点不稳定。我们仍然处于测试阶段,所以这是可以预期的。然而,该视图产生的崩溃使这里的一些例子无法