SwiftUI 隐藏/取消List的分割线
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI 隐藏/取消List的分割线相关的知识,希望对你有一定的参考价值。
参考技术A 目前SwiftUI的中文资料太少了,我在学习过程中碰到的问题随手记录下来,分享给碰到同样问题的人UITableview的separatorStyle枚举在此对List通用
究其原因是因为:对于 List 来说,SwiftUI 底层直接使用了成熟的 UITableView 的一套实现逻辑,而并非重新进行绘制,每个row也是对应的UITableViewCell, SwiftUI 层只是 View 描述的数据抽象
在ios 14 以上方法无效,有一种简单的方式去除分割线即设置listStyle
在iOS15 苹果新增了一个api可以直接调用
详情以 苹果文档 为准
SwiftUI:如何在 SwiftUI 视图中取消计时器?
【中文标题】SwiftUI:如何在 SwiftUI 视图中取消计时器?【英文标题】:SwiftUI: How to cancel timer in SwiftUI view? 【发布时间】:2019-09-29 11:25:09 【问题描述】:我在 SwiftUI 视图中使用计时器,如下面的代码所示。它按预期工作,但在某些情况下我想取消/停止该计时器。 timer var 上似乎没有“.cancel”属性或方法。如何取消此计时器?有什么想法/提示吗?
import SwiftUI
struct ContentView: View
@State private var selection = 2
@State private var rotation: Double = GBstrtest
let timer = Timer.publish (every: 0.8, on: .current, in: .common).autoconnect()
var body: some View
TabView(selection: $selection)
Text("Settings")
.font(.title)
.tabItem
VStack
Image(systemName: "gear")
.font(Font.system(.title ))
Text("Settings")
.tag(0)
VStack
Divider().padding(2)
ZStack
Image("image1")
.resizable()
.aspectRatio(contentMode: .fit)
Image("image2")
.resizable()
.aspectRatio(contentMode:.fit)
.rotationEffect(.degrees(rotation))
.animation(.easeInOut(duration: 0.3) )
.padding(EdgeInsets(top: 0, leading: 50, bottom: 0, trailing: 50))
Spacer()
.tabItem
VStack
Image(systemName: "speedometer")
.font(Font.system(.title ))
Text("Read Meter")
.tag(1)
.onReceive(timer)
_ in self.rotation = Double.random(in: 0 ... 200)
// How do I cancel timer HERE!?
【问题讨论】:
【参考方案1】:在您的条件语句中,使用以下代码:
self.timer.upstream.connect().cancel()
【讨论】:
如何重新连接? @RazibMollick self.timer.upstream.autoconnect() 是重新连接 timer.upstream.autoconnect() 工作,但您的计时器很可能应该是 @State var,因为它正在重新初始化。如果您像我一样使用“让”作为计时器,则 autoconnect() 将不起作用。希望这会有所帮助。【参考方案2】:整个周期是这样的:
struct MySwiftUIView : View
...
@State var timer = Timer.publish (every: 1, on: .current, in: .common).autoconnect()
@State var timeRemaining = -1
var body: some View
ZStack
// Underlying shapes etc as needed
Text("\(timeRemaining)").
.opacity(timeRemaining > 0 ? 1 : 0)
.onReceive(timer) _ in
if self.timeRemaining < 0
// We don't need it when we start off
self.timer.upstream.connect().cancel()
return
if self.timeRemaining > 0
self.timeRemaining -= 1
else
self.timer.upstream.connect().cancel()
// Do the action on end of timer. Text would have been hidden by now
.onTapGesture // Or any other event handler that should start countdown
self.timeRemaining = Int(delayValue)
self.timer = Timer.publish (every: 1, on: .current, in:
.common).autoconnect()
瞧!一个可重复使用的计时器,想用多少次就用多少次!
【讨论】:
以上是关于SwiftUI 隐藏/取消List的分割线的主要内容,如果未能解决你的问题,请参考以下文章