我试图弄清楚如何检测 SwiftUI 中的动画是否已完成,具体来说:Spring() 动画。我的第一个想法是使用 GeometryReader 来检测下面示例中的 Circle 何时到达原点(偏移量 = .0),但是这种方法有一个警告:Spring() 动画稍微超出了该点它应该在哪里结束然后反弹回来。所以“动画结束”会在动画结束之前被触发。
我做了一些研究,发现了另一种方法:SwiftUI withAnimation 完成回调。然而,在此解决方案中,动画对象的偏移量与原点进行比较,因此与上述问题相同。
我可以使用计时器,但这不是一个优雅的解决方案,因为 Spring() 动画的持续时间会根据其开始位置动态变化,所以这不是方法。
在下面的示例中,我希望动画完成后圆圈变为绿色。
有办法解决这个问题吗?感谢您的帮助!
struct ContentView: View {
@State var offset: CGSize = .zero
@State var animationRunning = false
var body: some View {
VStack {
Circle()
.foregroundColor(self.animationRunning ? .red : .green)
.frame(width: 200, height: 200)
.offset(self.offset)
.gesture(
DragGesture()
.onChanged{ gesture in
self.offset = gesture.translation
}
.onEnded{_ in
self.animationRunning = true
withAnimation(.spring()){
self.offset = .zero
}
})
Spacer()
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有 Xcode 12/iOS 14 的问题。在带有 NavigationView 的工作表中使用多个 NavigationLink 会导致 NavigationLink 条目在返回页面后保持突出显示。这不仅是模拟器的问题。请参阅随附的 GIF:
有谁知道如何解决这个问题?
类似问题:SwiftUI - 表单中的 NavigationLink 单元格在详细信息弹出后保持突出显示(但这不是这里的问题)。
struct ContentView: View {
var body: some View {
Text("")
.sheet(isPresented: .constant(true), content: {
NavigationView {
Form {
Section {
NavigationLink("Link to ViewB", destination: ViewB())
}
}
.navigationBarTitle("ViewA")
}
})
}
}
struct ViewB: View {
@State var selection = 0
let screenOptions = ["a", "b", "c"]
var body: some View{
Form {
Section {
NavigationLink("Link to ViewC", destination: ViewC()) …Run Code Online (Sandbox Code Playgroud) 我正在努力在 ScrollView 中同时实现 TapGesture 和 LongPressGesture。使用 .onTapGesture 和 .onLongPressGesture 一切正常,但我希望当用户点击按钮时,按钮的不透明度会降低,就像普通的 Button() 一样。
但是,无论出于何种原因,Button() 都无法选择在长按时执行某些操作。所以我尝试使用 .gesture(LongPressGesture() ... )。此方法有效并显示抽头指示。不幸的是,这不适用于 ScrollView:你不能再滚动它了!
所以我做了一些研究,我发现在 LongPressGesture 之前必须有一个 TapGesture 才能让 ScrollView 正常工作。确实如此,但我的 LongPressGesture 不再起作用。
希望有人有解决方案...
struct ContentView: View {
var body: some View {
ScrollView(.horizontal){
HStack{
ForEach(0..<5){ _ in
Button()
}
}
}
}
}
struct Button: View{
@GestureState var isDetectingLongPress = false
@State var completedLongPress = false
var body: some View{
Circle()
.foregroundColor(.red)
.frame(width: 100, height: 100)
.opacity(self.isDetectingLongPress ? 0 : 1)
// That works, but …Run Code Online (Sandbox Code Playgroud) 我想使用带有圆形按钮的上下文菜单。如果长按激活上下文菜单,按钮周围会出现一个圆角矩形的阴影。我已经尝试过使用.contentShape(Circle()),但这根本不起作用。
有没有办法隐藏这个阴影或改变它的形状,使其与按钮匹配?也许底层 UIKit 视图的属性可以修改?
谢谢回答!
import SwiftUI
struct ContentView: View {
var body: some View {
Circle()
.frame(width: 100, height: 100, alignment: .center)
.foregroundColor(.yellow)
.contentShape(Circle()) //does not work
.contextMenu
{
Button(action: {}, label:
{
Text("Action 1")
})
Button(action: {}, label:
{
Text("Action 2")
})
}
}
}
Run Code Online (Sandbox Code Playgroud) 我是 SwiftUI 的新手。在尝试改进我的计时器应用程序时,我陷入了困境。
在我的 ContentView 中,我有两个 ObservedObjects:管理计时器功能的 Timer 对象和存储所有用户设置的 Settings 对象。我的目标是,如果用户更改切换设置,则会在 ContentView 类中定义的 MyTimer 实例中设置一个变量。
我的问题是我不知道如何从类设置访问该实例。
这可能是一个非常简单的解决方案,但是,我已经尝试让它工作很长一段时间了,但我运气不好。
感谢您的帮助!
struct ContentView: View {
@ObservedObject var myTimer = MyTimer()
@ObservedObject var settings = Settings()
...
Toggle(isOn: self.$settings.muteInSilenceMode) {
Text("Mute sound in silence mode")
}
...
}
class Settings: ObservableObject {
...
@Published var muteInSilenceMode: Bool = UserDefaults.standard.bool(forKey: "muteInSilenceMode"){
didSet{
UserDefaults.standard.set(self.muteInSilenceMode, forKey: "muteInSilenceMode"
// I want to access the Timer object from here
}
}
...
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个 SwiftUI 应用程序,并使用 NavigationView 和一个大标题栏。但是,我不喜欢 navigationBarItems 按钮与消息应用程序(第一张和第二张图片)中的大标题栏(第三张图片)不对齐。我尝试重新定位按钮,但它不再可单击。有人知道如何解决这个问题吗?谢谢!
我正在创建一个显示时间信息的自定义列表(分钟和秒,未在下面的代码段中用于简化代码)。当用户向列表中添加一个条目时,我设法实现了一个很好的动画,但删除一个条目没有动画(第一个 GIF)。
在 iOS 14 中,动画可以正常工作,但是,动画只会从列表中删除最后一个矩形,然后更新每行中的文本(第二个 GIF)。这不是我想要的 - 我的目标是如果一行已被删除,其他行应该填满该空间并相应地移动 - 带有动画。
行的 ID 可能有问题,但我无法解决这个问题。感谢您的帮助!
struct ContentView: View {
@State var minutes = [0]
@State var seconds = [0]
@State var selectedElement = 0
var body: some View {
ScrollView(){
VStack{
ForEach(minutes.indices, id: \.self){ elem in
ZStack{
EntryBackground()
Text("\(self.minutes[elem])")
.transition(AnyTransition.scale)
HStack{
Button(action: {
withAnimation(.spring()){
self.seconds.remove(at: elem)
self.minutes.remove(at: elem)
}
})
{
Image(systemName: "minus.circle.fill")
.foregroundColor(Color.red)
.font(.system(size: 22))
.padding(.leading, 10)
}
Spacer()
}
}
.padding(.horizontal)
.padding(.top)
.contentShape(Rectangle())
.onTapGesture {
withAnimation(.spring()){
self.selectedElement = elem …Run Code Online (Sandbox Code Playgroud) 我需要使用 UIPickerView 而不是 SwiftUI Picker,因为它存在一些错误,并且我需要对其进行更多控制。
使用下面的方法一切正常,但是,我需要一个宽度较小的选择器(约为原始宽度的 70%),但仍然显示所有三个选择器,并且仍然具有灰色背景的圆角(因此灰色背景框架宽度和三个拾取器之间的间距应减小)。
我尝试修改选择器的框架及其超级视图,但这根本不起作用。在 SwiftUI 中设置框架宽度,然后使用剪裁修饰符切断圆边,并切断数字的某些部分(所以这是不可能的)。
有人知道该怎么做吗?多谢!
import SwiftUI
struct ContentView: View {
@State private var selections: [Int] = [5, 10, 50]
var body: some View {
MainPicker(pickerSelections: self.$selections)
}
}
struct MainPicker: View {
@Binding var pickerSelections: [Int]
private let data: [[String]] = [
Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
Array(0...59).map { "\($0 < 10 ? "0" …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用可以点击和拖动的元素来实现 ScrollView。它应该按以下方式工作:
下面的代码涵盖了所有这些要求(抽头指示器除外)。但是,我不确定它为什么起作用,具体来说,为什么我需要使用 .highPriorityGesture 并且例如不能对 Tap Gesture 和 DragGesture 进行排序.sequenced(before: ...)(这会阻止滚动)。
另外,我希望在触地事件时收到通知(不是触地,参见 2.)。我尝试使用 LongPressGesture() 而不是 TapGesture(),但这也会阻止 ScrollView 滚动,之后甚至不会触发 DragGesture。
有人知道这是如何实现的吗?或者这就是 SwiftUI 的极限?如果是这样,是否有可能移植 UIKit 的东西来实现这一点(我也已经尝试过,但没有成功,ScrollView 的内容也应该是动态的,因此移植整个 ScrollView 可能很困难)?
谢谢你的协助!
struct ContentView: View {
var body: some View {
ScrollView() {
ForEach(0..<5, id: \.self) { i in
ListElem()
.highPriorityGesture(TapGesture().onEnded({print("tapped!")}))
.frame(maxWidth: .infinity)
}
}
}
}
struct ListElem: View {
@GestureState var dragging = CGSize.zero
var body: some View {
Circle() …Run Code Online (Sandbox Code Playgroud)