如何在 SwiftUI 中拥有一个覆盖视图,并在不同部分具有不同的过渡?例如,在我的具体示例中,我想实现以下目标:
我已经尝试过各种各样的事情,看来我必须在包装条件的视图上设置动画和过渡if showOverlay。但是,看起来覆盖层子视图上设置的所有.transition()和修饰符都被忽略了。.animation()
实际上可能吗?以下代码是我认为应该可以工作但显然根本不起作用的代码:
// any observable external variable, that enables / disables the overlay
@State showOverlay: bool = false
// surrounding view
VStack { /* .. */ }
.frame(maxWidth: .infinity, maxHeight: .infinity)
.overlay(
Group {
if showOverlay {
Overlay()
}
}
)
// overlay view
struct Overlay: View {
var body: some View {
VStack {
// style 1
Text("OverlayContent that slides in from bottom")
.transition(.move(edge: .bottom).combined(with: .opacity))
.animation(.easeInOut(duration: …Run Code Online (Sandbox Code Playgroud) 我将 SwiftUI EditButton() 与 List() 一起使用,但它突然停止与 iOS15 一起使用。虽然我不使用包装式 NavigationView,但是它以前工作得很好。无论如何,使用 NavigationView 对我来说不是一个选择。
\nstruct Test: View {\n @State private var items: [String] = ["Item1", "Item2", "Item3"] // mock / demo\n \n var body: some View {\n VTile(padding: 0) {\n HStack {\n Text("Title")\n Spacer()\n }\n .overlay(EditButton())\n \n List {\n ForEach(items, id: \\.self) { item in\n HStack {\n Text(item)\n Spacer()\n }\n }\n .onDelete(perform: delete)\n .onMove(perform: move)\n }\n .listStyle(PlainListStyle())\n }\n }\n \n func move(from source: IndexSet, to destination: Int) {\n // ...\n }\n \n …Run Code Online (Sandbox Code Playgroud) Xcode(我使用的是 v13.1)警告我,这quantityType(forIdentifier:)将在 iOS 的未来版本中被弃用。
因此,我检查了苹果的开发人员文档,以获取还可以使用什么的提示。令人惊讶的是,在文档中它并没有被标记为在不久的将来已弃用。
在这种情况下应该相信哪个消息来源?如果quantityType(forIdentifier:)将来确实要删除,是否已经有已知的替代品?
deprecated deprecation-warning swift healthkit apple-documentation
swiftUI Stack 中的项目如何均匀对齐以填满所有可用空间?第一个和最后一个项目应该直接位于父级堆栈框架的开头/结尾,如下所示:
对于熟悉 css 的人来说,所需的行为等于 css3 property display: flex; justify-content: space-between;。
让 swiftUI 仍然基于嵌套观察对象进行更新的最佳方法是什么?
以下示例显示了我对嵌套观察对象的含义。球管理器的 balls 数组是一个已发布的属性,其中包含可观察对象的数组,每个对象本身都有一个已发布的属性(颜色字符串)。
不幸的是,当点击其中一个球时,它不会更新球的名称,也不会收到更新。那么我可能搞砸了在这种情况下联合收割机是如何工作的?
import SwiftUI
class Ball: Identifiable, ObservableObject {
let id: UUID
@Published var color: String
init(ofColor color: String) {
self.id = UUID()
self.color = color
}
}
class BallManager: ObservableObject {
@Published var balls: [Ball]
init() {
self.balls = []
}
}
struct Arena: View {
@StateObject var bm = BallManager()
var body: some View {
VStack(spacing: 20) {
ForEach(bm.balls) { ball in
Text(ball.color)
.onTapGesture {
changeBall(ball)
}
}
}
.onAppear(perform: createBalls)
.onReceive(bm.$balls, perform: …Run Code Online (Sandbox Code Playgroud) 处理 SwiftUI 的最佳方法是重新渲染使用DragGesture和.offset()修饰符移动的整个视图:MyView().offset(x: drag.translation.width)?
一旦MyView()是一个非常大的视图,包含大量复杂的子视图,拖动开始变得越来越不平滑,这显然是因为 SwiftUI 每次移动时都会重新渲染整个视图,这也会导致所有后代视图将被重绘等等。
.offset()移动大视图时使用修改器不可行吗?有没有其他方法?到目前为止,使用此处描述的 DragGewture 和偏移修改器(或在某些情况下为位置)似乎是常见的方法。
您可以在 swiftUI 中将aNavigationLink用作 aMenu的项目吗?
它似乎什么都不做:
Menu {
NavigationLink(destination: Text("test1")) {
Text("item1")
}
NavigationLink(destination: Text("test2")) {
Text("item2")
}
} label: {
Text("open menu")
}
Run Code Online (Sandbox Code Playgroud)
如果它不能像上面尝试的那样工作,是否有其他方法可以实现预期的结果?
我注意到 XCode 使用 swiftUI 的奇怪行为withAnimation{}。
我创建了以下工作示例:
import SwiftUI
class Block: Hashable, Identifiable {
// Note: this needs to be a class rather than a struct
var id = UUID()
static func == (lhs: Block, rhs: Block) -> Bool {
lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(self.id)
}
}
struct ContentView: View {
@State private var blocks: [Block]
init() {
var blocks = [Block]()
/// generate some blocks here
blocks.append(Block())
blocks.append(Block())
blocks.append(Block())
self._blocks = State(initialValue: …Run Code Online (Sandbox Code Playgroud) iOS 从后台通知返回 json 数据,类型为[AnyHashable : Any]. 有什么方法可以将其解析为实现 Codable 协议的结构吗?
例子 :
// Server sends the following data via apn
{"items": [{"id": "192e7926-7891-44eb-8ca7-f795d8552e84", "text": "some text", "num": 0.7}]}
Run Code Online (Sandbox Code Playgroud)
eapp端接收数据时
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print(userInfo["items"])
}
Run Code Online (Sandbox Code Playgroud)
print 语句给出以下输出
Optional(<__NSSingleObjectArrayI 0x283fe80b0>(
{
id = "192e7926-7891-44eb-8ca7-f795d8552e84";
num = "0.7";
text = "Check test";
}
))
Run Code Online (Sandbox Code Playgroud)
我已经有一个匹配的可编码结构:
struct Item: Codable {
let id: UUID
let text: String
let num: Double
} …Run Code Online (Sandbox Code Playgroud) swift ×7
swiftui ×7
alignment ×1
codable ×1
combine ×1
decodable ×1
deprecated ×1
draggesture ×1
healthkit ×1
ios ×1
ios15 ×1
listview ×1
swift5 ×1
transition ×1
xcode ×1