GithubHelp home page GithubHelp logo

jaywcjlove / swiftui-example Goto Github PK

View Code? Open in Web Editor NEW
408.0 6.0 30.0 32.41 MB

SwiftUI 示例,技巧和技术集合,帮助我构建应用程序,解决问题以及了解SwiftUI的实际工作方式。

Home Page: https://jaywcjlove.github.io/swiftui-example

License: MIT License

Swift 83.68% Rich Text Format 0.14% Markdown 16.17%
swift swiftui ios swiftui-example example uikit

swiftui-example's Introduction

SwiftUI by Example

Buy me a coffee

SwiftUI 示例,技巧和技术集合,帮助我构建应用程序,解决问题以及了解 SwiftUI 的实际工作方式。主要内容来源 hackingwithswift.com,下面所有实例都是在 macOS Big Sur 系统上运行,基于 Xcode 12.4 开发。

🚧 注意:示例适用于 macOS/iOS 的 Swift 编程(主要是 macOS),文字解释内容基于 Google 翻译,英文水平有限欢迎 RP 完善,小部分经过了添加或者修改,对部分内容进行了新增。如果对 Swift 语法不熟悉,这里有简单的 Swift 语法入门,对 SwiftUI 不熟悉,在这里提供了一个 SwiftUI 速查手册

🚧 注意:版权归属 hackingwithswift.com 原作者,对任何法律问题及风险不承担任何责任,没有任何商业目的,如果认为侵犯了您的版权,请来信告知。同时我不能完全保证内容的正确性。通过使用本站内容带来的风险与我无关。当使用本站时,代表您已接受了本站的使用条款和隐私条款。

为方便在 Swift 中颜色拾取,提供了一个小工具(UI-Color),欢迎提出改进意见。

SwiftUI 论坛

只是讨论 SwiftUI 事物的地方 论坛→。想法来源于 sindresorhus/swiftui

✦ 我的 macOS 应用程序:

Time Passage Iconize Folder Textsound Saver Create Custom Symbols DevHub Resume Revise Palette Genius Symbol Scribe

示例目录

介绍

简要介绍 SwiftUI 的基础

建立一个完整的项目

通过实际的应用程序项目学习 SwiftUI

使用静态文本

整齐地布局文本

图像,形状和媒体

绘制图标,圆形,渐变等

视图布局

布局大小,优先级和间距

堆栈,网格,滚动视图

以结构化方式定位视图

用户界面控件

响应交互并控制程序状态

响应事件

快捷方式,旋转方式和外观

点击和手势

滑动,轻击,摇动和其他输入

状态

响应交互并控制程序状态

列表

创建数据滚动表

表单

快速有效地获得用户输入

容器

将视图放置在导航控制器等中

对话框和菜单

发生某些情况时显示模式通知

切换界面

将您的用户从一个视图移动到另一个视图

转换视图

剪辑,大小,比例,旋转等

绘画

使用自定义形状控制渲染

动画

通过运动使您的界面栩栩如生

排版视图

使您的UI结构更易于理解

跨平台 SwiftUI

学习让您的应用在任何地方都看起来很棒

数据

通过 Core Data 集成和更多功能处理数据

辅助功能

如何使每个人都能使用您的应用

工具

使用Xcode的帮助构建更好的应用程序

附录A

如何使用每个 SwiftUI 属性包装器

工具推荐

贡献者

一如既往,感谢我们出色的贡献者!

使用 action-contributors 制作。

License

Licensed under the MIT License.

swiftui-example's People

Contributors

andy0570 avatar jaywcjlove avatar renovate[bot] avatar zhu-hongwei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

swiftui-example's Issues

画三角形

struct Triangle: Shape {
    func path(in rect: CGRect)-> Path {
        var path = Path()

        path.move(to: CGPoint(x: rect.midX, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
        path.addLine(to: CGPoint(x: rect.midX, y: rect.minY))

        return path
    }
}

使用

Triangle()
    .fill(Color.green)
    .frame(width: 100, height: 100, alignment: .center)

对数组 Array 的操作

insert 插入

var myArray = ["Steve", "Bill", "Linus", "Bret"]
myArray.insert("jaywcjlove", at: 1)
print(myArray)
// ["Steve", "jaywcjlove", "Bill", "Linus", "Bret"]

append 添加到末尾

var myArray = ["Steve", "Bill", "Linus", "Bret"]
myArray.append("wcj")
print(myArray)
// ["Steve", "Bill", "Linus", "Bret", "wcj"]

合并数组

var array1 = [1,2,3,4,5]
let array2 = [6,7,8,9]

let array3 = array1+array2
print(array3)
array1.append(contentsOf: array2)
print(array1)

删除所有 Core Data 数据

let entities = PersistenceController.shared.container.managedObjectModel.entities
for entity in entities {
    if ((entity.name) != nil) {
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try viewContext.execute(deleteRequest)
            try viewContext.save()
        } catch {
            print ("There was an error")
        }
    }
}

点击展开下拉菜单 Menu

image

Menu("PDF") {
    Button("Open in Preview", action: { })
    Button("Save as PDF", action: { })
}
.menuStyle(BorderlessButtonMenuStyle())

如何将一个View 作为变量传递给另一个View struct

https://stackoverflow.com/a/63937440/1334703

struct ContainerView<Content: View>: View {
    let content: Content

    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        content
    }
}

这不仅允许您将简单的Views放入其中,而且由于使用@ViewBuilder,还可以使用if-else和switch-case块:

使用示例 1:

struct SimpleView: View {
    var body: some View {
        ContainerView {
            Text("SimpleView Text")
        }
    }
}

使用示例 2:

struct IfElseView: View {
    var flag = true
    
    var body: some View {
        ContainerView {
            if flag {
                Text("True text")
            } else {
                Text("False text")
            }
        }
    }
}

使用示例 3:

struct SwitchCaseView: View {
    var condition = 1
    
    var body: some View {
        ContainerView {
            switch condition {
            case 1:
                Text("One")
            case 2:
                Text("Two")
            default:
                Text("Default")
            }
        }
    }
}

如果您想要一个贪婪的容器,它将占用所有可能的空间(与上面的容器只声明其子视图所需的空间相反),这里是:

struct GreedyContainerView<Content: View>: View {
    let content: Content

    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        Color.clear
            .overlay(content)
    }
}

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Other Branches

These updates are pending. To force PRs open, click the checkbox below.

  • chore(deps): update actions/checkout action to v4
  • chore(deps): update actions/setup-node action to v4
  • chore(deps): update peaceiris/actions-gh-pages action to v4

Detected dependencies

github-actions
.github/workflows/ci.yml
  • actions/checkout v3
  • actions/setup-node v3
  • peaceiris/actions-gh-pages v3
  • ncipollo/release-action v1
npm
package.json
  • idoc ^1.29.0

  • Check this box to trigger a request for Renovate to run again on this repository

Optional to String

func convertToInt(_ string: String?) -> Int? {
    return string.flatMap(Int.init)
}

let str = convertToInt("23")
print(str) // Optional(23)

print(str ?? "") // 23

guard let value = str else {return}
print(value) // 23

结构 struct 只能从协议继承

结构只能从协议继承(如果正确的话)。 不能从基本结构继承,所以您不能做

struct Resolution {
    var width = 0
    var height = 0
}

struct MyStruct: Resolution { ... }  // ERROR!

因此,有两个选择。 第一种是改用类。 第二个是重构代码以使用协议。

因此,有一些常用方法,则可以执行以下操作:

protocol PixelContainer {
   var width: Int { get }
   var height: Int { get }
}

extension PixelContainer {
    var count: Int { return width * height }
}

struct Resolution: PixelContainer {
    var width = 10
    var height = 20
}

let numPixels = Resolution().count  // Legal

循环 for..in, map, filter

实例

let values = [2.0, 4.0, 5.0, 7.0]
var squares: [Double] = []
for value in values {
   squares.append(value * value)
}
print(squares) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares2 = values.map({ (value: Double) -> Double in
  return value * value
})
print(squares2) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares2 = values.map { value in 
  value * value
}
print(squares2) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares = values.map { $0 * $0 }
print(squares) // [4.0, 16.0, 25.0, 49.0]
let scores = [0,28,124]
let words = scores.map {
    NumberFormatter.localizedString(from: NSNumber(value: $0), number: .spellOut)
}
print(words) // ["zero", "twenty-eight", "one hundred twenty-four"]
let milesToPoint = ["point1":120.0, "point2": 50.0,"point3": 70.0]
let kmToPoint = milesToPoint.map { name,miles in miles * 1.6093 }
print(kmToPoint) // [112.651, 193.11599999999999, 80.465]
let lengthInMeters: Set = [4.0, 6.2, 8.9]
let lengthInFeet = lengthInMeters.map { meters in meters * 3.2808 }
print(lengthInFeet) // [29.199120000000004, 20.340960000000003, 13.1232]
let digits = [1, 4, 5, 10, 15]
let even = digits.filter { (number) -> Bool in return
   number % 2 == 0
}
print(even) // [4, 10]

// -----> 简写 <------

let digits = [1, 4, 10, 15]
let even = digits.filter { $0 % 2 == 0 }
print(even) // [4, 10]

实例

func hashtags(in string: String) -> [String] {
    let words = string.components(
        separatedBy: .whitespacesAndNewlines
    )
    // 通过过滤器,我们可以删除所有不符合条件的元素
    // 给定的要求,在这种情况下,那些没有开始的要求
    // 以前置的"#"字字符:
    return words.filter { $0.starts(with: "#") }
}

let tags = hashtags(in: "#Swift by Hello #Basics")
print(tags) // ["#Swift", "#Basics"]

实例

func hashtags(in string: String) -> [String] {
    let words = string.components(
        separatedBy: .whitespacesAndNewlines
    )
    let tags = words.filter { $0.starts(with: "#") }
    // 使用'map',我们可以将闭包作为转换将值序列转换为新的值数组:
    return tags.map { $0.lowercased() }
}

let strings = [
    "I'm excited about #SwiftUI",
    "#Combine looks cool too",
    "This year's #WWDC was amazing"
]
let tags = strings.map { hashtags(in: $0) }
print(tags) // [["#swiftui"], ["#combine"], ["#wwdc"]]

退出应用

Button(action: {
    // 退出应用
    NSApplication.shared.terminate(self)
}, label: {
    Image(systemName: "clock")
    Text("Click Me")
})

使用 Swift 更改占位符(placeholder)文本颜色

您可以使用属性字符串设置占位符文本。 通过属性传递所需的颜色:

SwiftUI 使用

struct ContentView: View {
    @State var text = ""
    var body: some View {
        ZStack(alignment: .leading) {
            if text.isEmpty { Text("Placeholder").foregroundColor(.red) }
            TextField("", text: $text)
        }
    }
}

iShot2021-05-09 02 37 53

var myTextField = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 30))
myTextField.backgroundColor = .blue
myTextField.attributedPlaceholder = NSAttributedString(
    string: "placeholder text",
    attributes: [NSForegroundColorAttributeName: UIColor.yellow]
)

Swift 3+ 使用以下内容:

myTextField.attributedPlaceholder = NSAttributedString(
    string: "placeholder text",
    attributes: [NSAttributedStringKey.foregroundColor: UIColor.white]
)

Swift 4.2 使用以下内容:

myTextField.attributedPlaceholder = NSAttributedString(
    string: "placeholder text",
    attributes: [NSAttributedString.Key.foregroundColor: UIColor.white]
)

删除不再支持的旧模拟器以清理一些空间

除了获得 Mac)是从 Mac App Store 下载 Xcode。

如果您已经使用 Xcode 一段时间了,您应该删除不再支持的旧模拟器以清理一些空间。 使用以下终端命令删除旧模拟器:

$ xcrun simctl delete unavailable

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.