普通视图

发现新文章,点击刷新页面。
昨天 — 2025年11月29日首页

#3 Creating Shapes in SwiftUI

作者 Neo_Arsaka
2025年11月29日 13:44

示例程序

struct ShapesBootcamp: View {
    var body: some View {
        RoundedRectangle(cornerRadius: 4)
            .stroke(
                Color.purple,
                style: StrokeStyle(lineWidth: 4, dash: [10, 5])
            )
            .frame(width: 200, height: 100)
    }
}

形状类型

类型 初始化 几何描述
Circle() 无参 外接最小圆
Ellipse() 无参 外接椭圆
Capsule(style:) .circular / .continuous 两端半圆
Rectangle() 无参 无圆角
RoundedRectangle(cornerRadius:style:) 半径 + 风格 四角等半径

所有形状默认撑满父视图提案尺寸;使用 .frame() 可强制固定宽高。

视觉修饰符

修饰符 功能 示例 备注
.fill(_:) 内部填充 .fill(Color.blue) 支持纯色、渐变
.stroke(_:lineWidth:) 等宽描边 .stroke(.red, lineWidth: 2) 默认线帽 butt
.stroke(_:style:) 高级描边 .stroke(.orange, style: StrokeStyle(...)) 虚线、线帽、线连接
.trim(from:to:) 路径裁剪 .trim(from: 0.2, to: 0.8) 0–1 比例
.frame(width:height:alignment:) 固定尺寸 .frame(200, 100) 形状无固有尺寸
.scale(_:anchor:) 缩放 .scale(1.2) 锚点默认 center
.rotation(_:anchor:) 旋转 .rotation(.degrees(45)) 同上
.offset(x:y:) 平移 .offset(x: 10) 仅视觉偏移
.opacity(_:) 透明度 .opacity(0.5) 0–1
.blendMode(_:) 混合模式 .blendMode(.multiply) 需同级 ZStack
.mask(_:) 遮罩 .mask(Circle()) 支持任意 View
.shadow(color:radius:x:y:) 阴影 .shadow(.black, 4, x: 2, y: 2) 先阴影后形状
.accessibilityHidden(true) 隐藏朗读 见上 纯装饰时推荐

任务速查表

需求 片段
圆角按钮背景 RoundedRectangle(cornerRadius: 12).fill(.accent)
环形进度 Circle().trim(from: 0, to: progress).stroke(.blue, lineWidth: 4)
虚线边框 Rectangle().stroke(style: StrokeStyle(lineWidth: 1, dash: [5]))
胶囊标签 Capsule().fill(Color.gray.opacity(0.2))

性能与可访问性

  1. 矢量路径自动适配 @2x/@3x,无位图失真。
  2. 支持动态颜色与「降低透明度」辅助选项。
  3. 动画复杂时启用 .drawingGroup() 以 Metal 合成,降低 CPU 负担。
  4. 纯装饰形状请附加 .accessibilityHidden(true),避免 VoiceOver 读出「图像」。

#2 Adding Text in SwiftUI

作者 Neo_Arsaka
2025年11月29日 13:13

示例

struct TextBootcampView: View {
    var body: some View {
        Text("Hello, World!".capitalized)   // 格式化字符串
            .multilineTextAlignment(.leading)
            .foregroundColor(.red)
            .frame(width: 200, height: 100, alignment: .leading)
            .minimumScaleFactor(0.1)        // 极限压缩
    }
}

修饰符行为

修饰符 作用 备注 / 坑
.capitalized 先「单词首字母大写」再显示 这是 String 的 Foundation 方法,不是 Text 的修饰符;对中文无效果
.font(.body) 系统动态字体「正文」级别 会随用户「设置-显示与文字大小」变化,无障碍友好
.fontWeight(.semibold) / .bold() 字重 两者可叠加,后写的覆盖前面的
.underline(true, color: .red) 下划线 + 自定义颜色 false 可取消;颜色缺省用 foregroundColor
.italic() 斜体 只对支持斜体的字体有效;中文一般无斜体轮廓
.strikethrough(true, color: .green) 删除线 与 underline 可同时存在
.font(.system(size:24, weight:.semibold, design:.default)) 完全自定义字体 不会响应动态类型,除非自己再包 UIFontMetrics;苹果官方推荐优先用 Font 语义化 API
.baselineOffset(50) 基线偏移 正值上移,负值下移;可做「上标/下标」效果,但别用于整行,会炸行高
.kerning(1) 字符间距 对中文同样生效;负值会让字贴得更紧
.multilineTextAlignment(.leading) 多行文字水平对齐 只在「宽度被限制且文字折行」时生效
.foregroundColor(.red) 文字颜色 iOS 17 起新增 foregroundStyle 支持渐变/材质,旧项目注意版本
.frame(width:200, height:100, alignment:.leading) 给 Text 套固定尺寸 Text 默认是「尺寸自适应」;一旦加 frame,多余文字会被截断除非搭配 minimumScaleFactor
.minimumScaleFactor(0.1) 超长时等比缩小 范围 0.01–1.0;与 lineLimit(nil) 配合可实现「先缩再放」效果

#1 How to use Xcode in SwiftUI project

作者 Neo_Arsaka
2025年11月29日 12:59

Bundle Identifier

在 Xcode 中,Bundle Identifier(包标识符) 是一个唯一标识你 App 的字符串,它在整个 Apple 生态系统中用于区分你的应用

截屏2025-11-29 12.49.26.png

注意事项

  • 必须唯一:Bundle ID 在 Apple 生态系统中必须唯一,不能与其他已上架或未上架的 App 冲突
  • 区分大小写:虽然系统不区分大小写,但建议保持一致
  • 不可更改:一旦上传到 App Store Connect 或使用某些功能(如推送通知、iCloud),Bundle ID 就不能更改
  • 与 App ID 对应:在 Apple Developer 后台,Bundle ID 对应一个 App ID,用于配置证书、推送、iCloud 等功能

程序入口

@main 标识标明这是程序的入口

//
//  SwiftfulThinkingBootcampApp.swift
//  SwiftfulThinkingBootcamp
//
//  Created by Lancoff Allen on 2025/10/23.
//

import SwiftUI

@main
struct SwiftfulThinkingBootcampApp: App {
    var body: some Scene {
        WindowGroup {
//            ContentView()
            AppStorageBootcamp()
        }
    }
}

程序设置界面

如果点击左侧 Navigator 中的第一级目录(SwiftfulThinkingBootcamp),就会进入程序信息设置

其中 Identity -> DisplayName 就是程序显示给用户的名称

截屏2025-11-29 12.55.06.png

❌
❌