我目前正在使用 UITextView,现在我想在那里设置字体。据我所知,我只能应用 UIFont,而不能应用 Font 类本身。我找到了几个将 UIFont 转换为 Font 的指南,但没有一个将 Font 转换为 UIFont 的指南。有没有办法做到这一点,或者 SwiftUI 中是否有一个等效的 UI 类,它具有与 UITextView 相同的功能,并且采用 Font 而不是 UIFont?提前谢谢 :-)
Strassenrenner's questions
我已经构建了一个带有动画的视图,一切似乎都工作正常,但后来我发现它只适用于第一次,而不适用于第二次。由于我是 Swift 编程的新手,我不知道问题出在哪里。我查看了不同的动画教程,并且所有教程的工作方式都与我实现它的方式相同。我写了一个小样本来重现该问题:
import SwiftUI
struct BugSample: View {
var body: some View {
TabView {
ContentView()
.tabItem {
Label("BUG", systemImage: "checkmark")
}
}
}
}
struct Person: Identifiable, Hashable {
var id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
struct ContentView: View {
@State private var selectedPerson: Person?
var body: some View {
NavigationSplitView {
PersonsListView(selectedPerson: $selectedPerson)
} detail: {
if let selectedPerson {
GalleryView()
} else {
Text("Should not reach here")
}
}
}
}
struct PersonsListView: View {
@Binding var selectedPerson: Person?
var data = [Person(name: "A"), Person(name: "B"), Person(name: "C")]
var body: some View {
List(data, selection: $selectedPerson) { entry in
Text(entry.name)
.onTapGesture {
selectedPerson = entry
}
.listRowSeparator(.hidden)
}
}
}
struct GalleryView: View {
var body: some View {
NavigationStack {
VStack(spacing: 20) {
ProgressView()
CircularView()
}
}
}
}
struct CircularView: View {
@State var scale = 1.0
var body: some View {
Circle()
.frame(width: 200, height: 200)
.scaleEffect(scale)
.onAppear {
let baseAnimation = Animation.easeInOut(duration: 1)
let repeated = baseAnimation.repeatForever(autoreverses: true)
withAnimation(repeated) {
scale = 0.5
}
}
}
}
当您单击 3 个条目之一时,圆圈将正确动画,当我返回并再次打开屏幕时,它将不起作用。我还添加了一个 ProgressView 来检查它是否有效并且它正在旋转,所以问题可能出在代码中。我的第一个建议是 NavigationSplitView,因为我发现存在缺少动画的问题,但它与我的问题不同(https://forums.developer.apple.com/forums/thread/728132)。有人对这个问题有想法吗?在过去的几个小时里我尝试了几种方法,但我找不到让动画再次工作的方法。
我正在 SwiftUI 中制作动画,并在 TabView 中使用动画视图时遇到问题。我进行了很多搜索,确实找到了将状态属性与动画一起使用的相同方法。一切工作正常,除了当我使用 TabView 内的视图时。这是示例代码
import SwiftUI
public struct AnimatedView: View {
@State var isRotating: Bool? = false
@State var isAnimating: Bool = true
public var body: some View {
ZStack {
Circle()
.trim(from:0.1, to: 0.2)
.stroke(lineWidth: 5)
.rotation(Angle.degrees(0))
.frame(width: 60, height: 60)
.foregroundColor(.blue)
.rotationEffect(.degrees(isRotating! ? 360 : 0))
.onAppear() {
//if !isAnimating {
// return
//}
//isAnimating = false
withAnimation(Animation.linear(duration: 1).repeatForever(autoreverses: false)) {
self.isRotating!.toggle()
}
}
}
}
}
struct ContentView: View {
enum Tab: Hashable {
case tab1
case tab2
}
@State private var selectedTab: Tab = .tab1
var body: some View {
TabView(selection: $selectedTab) {
Text("Placeholder 11")
.tabItem {
Text("Tab 1")
}
AnimatedView()
.tabItem {
Text("Tab 2")
}
}
}
}
当打开第二个选项卡时,一切正常,但是当我离开它并重新输入它时,动画的行为会有所不同,因为它现在似乎有两种状态,当我多次重新进入屏幕时,它会变得更加狂野。我已经找到了解决方案,我有另一个标志,该标志将在第一次启动后反转,以便动画不会重新初始化,但这对我来说似乎有点老套。
当我理解正确时,onAppear 和 onDisappear 方法将在 View 关闭时被调用,但其 State 将被保留。所以看起来同一个视图会有多个状态。
由于我对动画还很陌生,所以我想知道动画是否有最佳实践,以便它们也可以在 TabViews 中工作(因为现在对我来说这似乎不是特殊情况:-))提前致谢